Отношения «один ко многим» между 3 сущностями в Doctrine 2

У меня есть три объекта: User, Office и PhoneNumber. У пользователя много телефонных номеров, и у офиса тоже много телефонных номеров.

Проблема в том, как представить отношения этих сущностей в Doctrine 2.

  1. Сначала я пытался использовать двунаправленные ассоциации «один ко многим» (Пользователь -> имеет много -> Номера телефонов) (Офис -> имеет много -> Номера телефонов), номер телефона имеет два поля сопоставления: одно для пользователя, а другое для офиса. . Это решение не работает, так как один из внешних ключей сопоставления не может быть нулевым.

  2. Мой второй подход заключался в использовании двух сущностей и одного суперкласса для PhoneNumber. В суперклассе PhoneNumber определены все общие поля, кроме поля сопоставления. Сущности UserPhoneNumber и OfficePhoneNumber расширили сущность PhoneNumber и указали другое поле сопоставления и другую таблицу. (одна таблица для номеров OfficePhoneNumbers, другая для номеров UserPhoneNumbers)

    Это решение на самом деле работает, но довольно уродливо иметь 3 класса для представления одной простой сущности.

  3. Мой третий подход заключается в использовании однонаправленного отображения «один ко многим». Это устранит необходимость сопоставления поля для объекта PhoneNumber. Проблема в том, что когда я использую каскадное удаление для поля «многие ко многим», это нарушает ограничение целостности при удалении записей.

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

Каков наилучший способ справиться с этим типом ассоциации?

Спасибо


person Marian Galik    schedule 13.08.2011    source источник
comment
Я сделал решение 1) успешно раньше. Не могли бы вы подробнее рассказать о вашем нулевом ограничении? Кроме того, каждый ли номер уникален? Это тоже играет роль, т.е. может ли номер телефона быть и пользователем, и офисом?   -  person Tjorriemorrie    schedule 14.08.2011
comment
Я не помню точное сообщение об ошибке, так как я переписываю свой код на 3). Я попробую еще раз решение 1) и сообщу вам точное сообщение об ошибке. Да, каждый номер уникален, пользователь и офис не могут использовать один и тот же номер.   -  person Marian Galik    schedule 15.08.2011
comment
Только что попробовал. Я создал один офис с двумя телефонными номерами, и после попытки его извлечения или удаления я получаю следующее сообщение: Notice: Undefined index: office_id in D:\www\App\vendor\doctrine\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php line 1270 office_id отображается в поле Phone.   -  person Marian Galik    schedule 15.08.2011
comment
Наконец это работает. Я просто сделал глупую ошибку и указал имя столбца соединения в атрибуте mappedBy вместо поля объекта Phone. Спасибо   -  person Marian Galik    schedule 15.08.2011


Ответы (1)


Я, наконец, решаю проблему, связанную с (вероятно, самым красивым) решением 1). Проблема заключалась в неправильном понимании атрибута mappedBy, который должен указывать поле сущности, а не поле базы данных.

person Marian Galik    schedule 15.08.2011