В Doctrine 2 ORM у меня есть абстрактная сущность «Связь», которая использует наследование SINGLE_TABLE, чтобы решить, какой тип связи это:
Communication.orm.yaml:
App\Entity\Communication:
type: entity
table: communication
inheritanceType: SINGLE_TABLE
discriminatorColumn:
name: mode
type: string
discriminatorMap:
push: App\Entity\Communication\Push
notice: App\Entity\Communication\Notice
email: App\Entity\Communication\Email
# ...
Таким образом, есть 3 типа связи (push, уведомление и электронная почта), которые все используют таблицу «коммуникаций».
Каждая «Связь» является переводимой. Ранее у меня было 3 сущности, содержащие эти переводы. Каждый из этих объектов i18n использует одну и ту же таблицу «i18n_communication» и содержит двунаправленную взаимосвязь «многие к одному» с соответствующим типом связи:
- App \ Entity \ I18n \ Связь \ Нажмите
- App \ Entity \ I18n \ Связь \ Примечание
- App \ Entity \ I18n \ Связь \ Электронная почта
Поскольку в Doctrine 2 использование нескольких сущностей, использующих одну и ту же таблицу без наследования таблиц, недопустимо, я заставил все сущности I18n расширить базовый класс I18nCommunication, аналогично сущностям не-i18n, которые они переводят:
I18nCommunication.orm.yaml:
App\Entity\I18N\Communication\I18nCommunication:
type: entity
table: i18n_communication
inheritanceType: SINGLE_TABLE
discriminatorColumn:
name: communication.mode ******
type: string
discriminatorMap:
push: App\Entity\I18N\Communication\Push
notice: App\Entity\I18N\Communication\Notice
email: App\Entity\I18N\Communication\Email
# ...
Это не работает. Все сущности, которые расширяют I18nCommunication, имеют поле «связь», которое ссылается на сущность «Связь», которую они переводят, но Doctrine не знает, что делать с линией «name: communication.mode».
У меня такой вопрос: как использовать поле из связанной сущности в качестве столбца дискриминатора?
Я попытался использоватьоризонтовый тип: JOINED и расширение I18nCommunication от связи, чтобы у меня был доступ к полю режима родителя. Тем не менее, это не работает из-за CommunicationTesignType: SINGLE_TABLE, он думает, что I18nCommunication должен находиться в таблице связи.
Есть ли способ сделать это? Или мне придется прибегнуть к объединению моих объектов I18nCommunication в один объект?
Спасибо.