web-dev-qa-db-ja.com

cascade = {"remove"} VS orphanRemoval = true VS ondelete = "CASCADE

親エンティティが削除されたときに子エンティティを自動的に削除する次の方法について、いくつかの情報を収集しようとしました。最も一般的な方法は、次の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

コードでの使用方法の例

  • orphanRemovalおよびcascade = {"remove"}は、逆エンティティクラスで定義されます。
  • ondelete = "CASCADE"は所有者エンティティで定義されています
  • @ORM\JoinColumn(onDelete = "CASCADE")と書くだけで、doctrineに列名を処理させることもできます。

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; 
87
Alexis_D

onDelete="CASCADE"はデータベース自体によって管理されます。 cascade={"remove"}は教義によって管理されます。

onDelete="CASCADE"は、操作が教義ではなくデータベースレベルで実行されるため、高速です。削除はDoctrineではなくデータベースサーバーによって実行されます。 cascade={"remove"} doctrineでは、エンティティ自体を管理する必要があり、他の所有エンティティがないかどうかを確認するために追加のチェックを実行します。他に存在しない場合、エンティティを削除します。ただし、これによりオーバーヘッドが発生します。


cascade = {"remove"}

  • 逆側のエンティティは、所有側のエンティティが削除されると削除されます。あなたが他の所有側エンティティと多くの人がいる場合でも。 いいえ、エンティティが他の何かによって所有されている場合、削除されません。
  • コレクションで使用する必要があります(OneToManyまたはManyToMany関係で)
  • oRMでの実装

orphanRemoval = "true"

  • 所有側のエンティティがANDで、他の所有側のエンティティに接続されなくなった場合、逆側のエンティティは削除されます。 正確には、これはdoctrineが他のエンティティに所有されていないように振る舞うため、削除します。
  • oRMでの実装
  • oneToOne、OnetoManyまたはManyToManyで使用できます

onDelete = "CASCADE"

  • これにより、データベースの外部キー列にカスケード削除が追加されます
  • この戦略を正しく行うには少し注意が必要ですが、非常に強力で高速です。 (これはdoctrine公式チュートリアルからの引用です...しかし、これ以上の説明はありません)
  • ORMは(以前の2つの方法と比較して)作業が少ないため、パフォーマンスが向上します。
53
Waaghals