User、Office、PhoneNumberの3つのエンティティがあります。ユーザーには多くの電話番号があり、オフィスにも多くの電話番号があります。
問題は、Doctrine2でこれらのエンティティの関係をどのように表現するかです。
最初は、双方向の1対多の関連付け([ユーザー]->[多数]->[PhoneNumbers])(Office->[多数]->[PhoneNumbers])を使用しようとしましたが、PhoneNumberには2つのマッピングフィールドがあります。1つはユーザー用、もう1つはOffice用です。 。マッピング外部キーの1つをnullにすることができなかったため、このソリューションは機能しません。
私の2番目のアプローチは、PhoneNumberに2つのエンティティと1つのスーパークラスを使用することでした。PhoneNumberスーパークラスは、マッピングフィールドを除くすべての共通フィールドを定義しています。エンティティUserPhoneNumberとOfficePhoneNumberは、PhoneNumberエンティティを拡張し、異なるマッピングフィールドと異なるテーブルを指定しました。(OfficePhoneNumbers用の1つのテーブル、UserPhoneNumbers用の別のテーブル)
このソリューションは実際には機能しますが、1つの単純なエンティティを表すために3つのクラスがあるのは非常に醜いです。
私の3番目のアプローチは、単方向の1対多マッピングを使用することです。これにより、PhoneNumberエンティティのマッピングフィールドが不要になります。問題は、多対多フィールドにカスケード削除を使用すると、レコードを削除するときに整合性制約に違反することです。
カスケード削除オプションを省略すると、UserまたはOfficeを削除した後、PhoneNumberはデータベースに残ります(ただし、マッピングテーブルのレコードは削除されます)。
このタイプの関連付けを処理するための最良の方法は何ですか?
ありがとう