次の点で問題があります...電話番号の表があります。ユーザーと会社で同じテーブルを使いたい。ユーザーは複数の電話番号と会社を持つこともできます。したがって、2 つの異なる結合テーブルとの 1 対多の一方向の関係が必要です。1 つは電話番号をユーザーにリンクするもので、もう 1 つは電話番号を企業にリンクするものです。これは、doctrine2 マニュアルの第 5.9 章に続く解決策です: (クリック)
私の users エンティティは次のコードを保持しています:
/** @ORM\ManyToMany(targetEntity="Application\Entity\PhoneNumber")
* @ORM\JoinTable(name="user_phone_number_linker",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="phone_number_id", referencedColumnName="id")}
* )
*/
protected $phone_numbers;
ユーザーを参照すると、会社に同じ電話番号エンティティクラスを使用できないため、双方向のものを作成できないため、単方向の1対多を使用します。今ではすべて問題なく動作していますが、電話番号を削除すると次のエラーが表示されます:「DELETE FROM phone_number WHERE id = ?」の実行中に例外が発生しました。パラメータ {"1":1}:
SQLSTATE[23000]: 整合性制約違反: 1451 親行を削除または更新できません: 外部キー制約が失敗しました ( database/user_phone_number_linker
, CONSTRAINT user_phone_number_linker_ibfk_11
FOREIGN KEY ( phone_number_id
) REFERENCES phone_number
( id
))
データベースで ON DELETE CASCADE 値を手動で設定すると問題なく動作しますが、これは doctrine2 を使用するという考えではなく、phpMyAdmin パネルに行かなくてもコード内で解決できるはずです。何らかの方法で、電話番号から結合テーブルへのカスケードを削除時に開始する必要がありますが、phone_number エンティティから結合テーブルへの参照を戻すことはありません。
賢い人がこれを解決するのを手伝ってくれることを願っています。
編集
その間、私は Doctrine2 についてさらに多くのことを学び、以前の質問を見直して、そもそもこれが複数の phoneNumbers を 1 つのテーブルに格納する正しい方法ではないことに気付きました。ユーザーの電話番号と会社の電話番号を同じテーブルに格納できるようにするには、テーブルの継承と識別子列を使用する必要があります。列には、ユーザー/会社の識別子が含まれている必要があります。
この列により、doctrine ORM はその phoneNumber が実際にユーザーまたは会社の電話番号であるかどうかを「認識」します。doctrine 2 spec の単一テーブル継承マッピング原則に従って、2 つの異なるエンティティ定義を作成する必要があります。
1 つのクラスUserPhoneNumber
は、とのmany-to-one
関係とUser
呼ばれる他のクラスとCompanyPhoneNumber
のone-to-many
関係を持ちCompany
ます。結合列は必ずしも必要ではありません。user_id
またはcompany_id
列は電話番号テーブルにある場合があります。User
クラスではCompany
関連付けが省略され、クラスCompany
ではUser
関連付けが省略されます (データベースはこれらの列に null 値を許可する必要があります)。
結合テーブルを使用する場合は、Doctrine2 仕様の結合テーブルを使用した 1 対多の一方向の説明に従っています。
続きを読む
それ以外の場合は、この精巧なDoctrine2 の詳細なWeb サイトで、関連付けとカスケードの問題について詳しく読むこともできます。