Как настроить отношение Doctrine для внешнего ключа, который может указывать на разные таблицы в зависимости от контекста? - PullRequest
0 голосов
/ 10 августа 2010

Я создаю приложение, построенное на PHP, MySQL и Doctrine v1.2, которое работает с упорядоченными группировками элементов, которые могут содержать элементы различных типов.Например, группа Мой последний отпуск может иметь изображения, видео и текстовые заметки.Эти элементы можно сортировать, чтобы они отображались в порядке, указанном конечным пользователем.

Каждый элемент другого типа будет иметь свои собственные свойства.Изображение может иметь подпись, видео может содержать ссылку на URL-адрес YouTube и т. Д. Элементы могут существовать в нескольких группах.Например, в группах Мой последний отпуск и Cool Vehicles .

может существовать один и тот же образ лодки. Я ищу лучший способ реализации вышеуказанного сценария сОтношения доктрины и как эти отношения будут представлены в файле схемы YAML.

В моем PHP-коде было бы здорово иметь возможность сделать что-то вроде:

$group = new Group();  
$item1 = new Image();  
$item1->caption = 'my caption'  

$item2 = new Video();  
$item2->url = 'youtube.com/1234';  

$group->Items[0] = $item1;  
$group->Items[1] = $item2;  
$group->save();  

Возможно ли это?Если нет, есть ли альтернативы для достижения аналогичного результата?

Ответы [ 4 ]

0 голосов
/ 12 августа 2010

Что вам нужно, это свойство наследования Доктрины. Если вы наследуете изображение и видео от одного базового класса, вы можете использовать его по своему усмотрению.

Пример:

Asset:
  columns:
    group_id: { integer(20) }
  relations:
    Group: { class: Group, local: group_id, foreignAlias: Assets  }
  actAs:
    Timestampable: ~
Video:
  columns:
    url: { type: string(1024) }
  inheritance:
    extends: Asset
    type: column_aggregation
    keyField: type
    keyValue: video
Image: 
  columns:
    caption: { type: string(255) }
  inheritance:
    extends: Asset
    type: column_aggregation
    keyField: type
    keyValue: image
Group:
  ...

Вот так

0 голосов
/ 10 августа 2010

Ваша проблема не в Doctrine, а в дизайне вашей базы данных. Внешние ключи ВСЕГДА указывают от одной таблицы точно на другую. Доктрина просто отображает это отношение в ваших объектах.

Для вашего примера я предлагаю создать таблицу / класс для «Записи», которая может содержать любой вид мультимедиа. Просто добавьте поля для «TextBody», «ImageFile», «VideoFile» и т. Д. И т. Д. В этот класс.

Тогда этим "записям" нужен внешний ключ для ваших "Групп", и все готово.

Таким образом, вы можете иметь видео, которые содержат дополнительное текстовое описание и изображение для предварительного просмотра, например. Все в одном объекте.

Возможно, этот подход нуждается в дальнейшей нормализации, но это зависит от остальной части вашей базы данных.

0 голосов
/ 10 августа 2010

Вы можете использовать супертип / подтип в дизайне БД, чтобы избежать этой проблемы. Создайте супертип для изображений, видео, заметок, а затем создайте ссылку на супертип.

Вот несколько ссылок на несколько похожих вопросов / ответов с моделями:

0 голосов
/ 10 августа 2010

Это невозможно, как я знаю. Также я не могу думать об изображениях, видео и текстах как о едином объекте. Это, безусловно, разные сущности. Группа «Последний отпуск» может быть фактически группой подгрупп «Последний отпуск - видеоролики», «Последний отпуск - изображения», «Последний отпуск - тексты». Вам это удобно?

...