Учение о полиморфной ассоциации - PullRequest
4 голосов
/ 31 января 2011

У меня есть таблица с именем forums со следующей структурой поля:

  1. object_type -> [Group |Страница |Турнир |и т. д.]. (Возможные значения. Каждый элемент имеет свою собственную таблицу)

  2. object_id -> [id группы |идентификатор страницы |идентификатор турнира |etc ..] (id object_type)

  3. id_forum, 4.name и т. д.

Тогда у меня есть следующие таблицы: Group, Page, Tournament и т. Д.

Возможно ли реализовать это с помощью доктрины?

Ответы [ 3 ]

7 голосов
/ 04 августа 2015

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

К сожалению, полиморфная ассоциация не совсем совпадает с CTI (наследование таблиц классов): CTI требует родительскую таблицу с тем же идентификатором длявсе подклассы.

CTI может работать в большинстве случаев, но это может быть проблемой, если вы хотите создать полиморфную связь между существующими сущностями, которые уже имеют свой собственный идентификатор и / или, возможно, могут иметь другой тип идентификатора.

Кроме того, CTI требует создать запись в родительской таблице для каждого подкласса, что бесполезно для полиморфной ассоциации.Полиморфная ассоциация не должна требовать какой-либо таблицы, она должна просто объединять существующие таблицы с условиями (id, type).Я полагаю, что Doctrine требуется родительская таблица для простоты / производительности.

Когда CTI не является решением, я предлагаю эмулировать полиморфную ассоциацию на уровне репозитория, т.е. создать абстрактный репозиторий с атрибутом $ type и реализоватьметод polymorphicJoin, который автоматически присоединяет текущий запрос к целевой таблице с условиями id / type.Затем расширяет абстрактный репозиторий вашими подклассами Repositories и при необходимости вызывает метод polymorphicJoin в ваших методах поиска / выбора.

Было бы замечательно, если бы такая связь была реализована в Doctrine.

5 голосов
/ 25 февраля 2011

Я думаю, что то, что вы ищете, может быть сделано с наследованием.

Проверьте http://www.doctrine -project.org / docs / orm / 2.0 / en / reference / наследование-mapping.html для подробного объяснения.

0 голосов
/ 19 июня 2012

У меня была похожая проблема. Я опубликовал полный пример того, как реализовать полиморфные ассоциации в Doctrine 2.2 в этом посте .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...