親エンティティが削除されたときに自動的に子エンティティを削除するために、以下の方法についていくつかの情報を収集しようとしました。最も一般的な方法は、cascade = {"remove"} OR orphanRemoval = true OR ondelete = "CASCADE"の 3つのアノテーションを使用することです。
私は3番目のものについて少し混乱しています:ondelete = "CASCADE"、これに関する教義の公式ドキュメントの説明は非常に少ないため)、私が収集した以下の情報を誰かが私に確認し、私の研究から理解できれば幸いですネットと経験...
何をする
Cascade = {"remove"}
==>所有側エンティティがある場合、反対側のエンティティは削除されます。あなたが他の所有する側の実体を持つmanytomanyにいる場合でも。
-コレクションで使用する必要があります(OneToManyまたはManyToMany関係で)-ORMでの
実装
orphanRemoval = true
==>所有側エンティティがANDであり、他の所有側エンティティに接続されていない場合、反対側のエンティティは削除されます。(
ref。doctrine official_doc
-ORMでの実装
-OneToOne、OnetoManyまたはManyToManyで使用できます
onDelete = "CASCADE"
==>これにより、データベース内の外部キー列にOn Delete Cascadeが追加されます
-この戦略は、正しく理解するのが少し難しいですが、非常に強力で高速です。( ref。doctrine official_doc ...しかし、これ以上の説明は読んでいません)-ORM
は(以前の2つの方法と比較して)必要な作業が少ないため、パフォーマンスが向上します。
その他の情報
-これらの3つの方法はすべて双方向関係エンティティに実装されています(そうですか???)。
cascade = {"remove"}を使用すると、外部キーonDelete = CASCADEが完全にバイパスされます。(参考文献doctrine_official_doc)
コードでの使用例
- orphanRemovalおよびcascade = {"remove"}は、逆エンティティクラスで定義されています。
- ondelete = "CASCADE"は所有者エンティティで定義されています
- @ORM \ JoinColumn(onDelete = "CASCADE")と書いてdoctrineに列名を処理させることもできます
カスケード= {「削除」}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
orphanRemoval = true
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
onDelete = "CASCADE"
/**
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/
protected $contact;