1

User、Office、PhoneNumberの3つのエンティティがあります。ユーザーには多くの電話番号があり、オフィスにも多くの電話番号があります。

問題は、Doctrine2でこれらのエンティティの関係をどのように表現するかです。

  1. 最初は、双方向の1対多の関連付け([ユーザー]->[多数]->[PhoneNumbers])(Office->[多数]->[PhoneNumbers])を使用しようとしましたが、PhoneNumberには2つのマッピングフィールドがあります。1つはユーザー用、もう1つはOffice用です。 。マッピング外部キーの1つをnullにすることができなかったため、このソリューションは機能しません。

  2. 私の2番目のアプローチは、PhoneNumberに2つのエンティティと1つのスーパークラスを使用することでした。PhoneNumberスーパークラスは、マッピングフィールドを除くすべての共通フィールドを定義しています。エンティティUserPhoneNumberとOfficePhoneNumberは、PhoneNumberエンティティを拡張し、異なるマッピングフィールドと異なるテーブルを指定しました。(OfficePhoneNumbers用の1つのテーブル、UserPhoneNumbers用の別のテーブル)

    このソリューションは実際には機能しますが、1つの単純なエンティティを表すために3つのクラスがあるのは非常に醜いです。

  3. 私の3番目のアプローチは、単方向の1対多マッピングを使用することです。これにより、PhoneNumberエンティティのマッピングフィールドが不要になります。問題は、多対多フィールドにカスケード削除を使用すると、レコードを削除するときに整合性制約に違反することです。

    カスケード削除オプションを省略すると、UserまたはOfficeを削除した後、PhoneNumberはデータベースに残ります(ただし、マッピングテーブルのレコードは削除されます)。

このタイプの関連付けを処理するための最良の方法は何ですか?

ありがとう

4

1 に答える 1

0

私は最終的に(おそらく最も良い)解決策に関連する問題を解決します1)。問題は、データベースフィールドではなくエンティティフィールドを指定する必要があるmappedBy属性の誤解にありました。

于 2011-08-15T14:08:13.547 に答える