親エンティティが削除されたときに子エンティティを自動的に削除する次の方法について、いくつかの情報を収集しようとしました。最も一般的な方法は、次の3つのアノテーションのいずれかを使用することであるようです:cascade = {"remove"}ORorphanRemoval = trueORondelete = "CASCADE"。
私は3番目のものについて少し混乱しています:ondelete = "CASCADE"、_の説明doctrineこのドキュメントに関する公式文書は非常に少ないです)誰かが私に以下の情報を確認してくれればネットと経験に関する私の研究...
cascade = {"remove"}
==>逆側のエンティティは、所有側のエンティティが削除されると削除されます。あなたが他の所有側エンティティと多くの人がいる場合でも。
-コレクションで使用する必要があります(OneToManyまたはManyToMany関係で)
-ORMでの実装
orphanRemoval = true
==>逆側のエンティティは、所有側エンティティが他の所有側エンティティに接続されなくなったときに削除されます。 (参照 doctrine official_doc -ORMでの実装
-OneToOne、OnetoMany、またはManyToManyで使用できます
onDelete = "CASCADE"
==>これは、データベースの外部キー列にOn Delete Cascadeを追加します
-この戦略は、正しく実行するには少し注意が必要ですが、非常に強力かつ高速です。 (ref。 doctrine official_doc ...しかし、これ以上の説明は読んでいません)
-ORMは、以前の2つの方法と比較して、実行する作業が少ないため、パフォーマンスが向上します。
その他の情報
-これらの3つの方法はすべて、双方向の関係エンティティ(right ???)
-cascade = {"remove"}を使用すると、外部キーonDelete = CASCADEが完全にバイパスされます。 (参照 doctrine_official_doc )
cascade = {"remove"}
/**
* @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;
onDelete="CASCADE"
はデータベース自体によって管理されます。 cascade={"remove"}
は教義によって管理されます。
onDelete="CASCADE"
は、操作が教義ではなくデータベースレベルで実行されるため、高速です。削除はDoctrineではなくデータベースサーバーによって実行されます。 cascade={"remove"}
doctrineでは、エンティティ自体を管理する必要があり、他の所有エンティティがないかどうかを確認するために追加のチェックを実行します。他に存在しない場合、エンティティを削除します。ただし、これによりオーバーヘッドが発生します。
cascade = {"remove"}
orphanRemoval = "true"
onDelete = "CASCADE"