Doctrineアソシエーションに関するカスケード操作の理解を確認したいと思います。この質問の目的のために、2つのモデル:Customer
とInsuree
があります。
Customer
とInsuree
の間に多対多の関係を定義し、cascade{"all"}
、これは次のことを理解しています。
これは、Customers
の関連付けの定義です。
/**
* @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"})
* @ORM\JoinTable(name="customer_insuree",
* joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")}
* )
*/
protected $insurees;
Insuree
とCustomer
の逆多対多の関係を定義し、cascade{"all"}
、これは次のことを理解しています。
これは、Insurees
の関連付けの定義です。
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"})
*/
protected $customers;
その後、カスケード、持続、マージ、デタッチに関する関係を定義すると、保険者を削除しても関連するすべての顧客は削除されません-保険者とその顧客の間の関連付けのみが削除されますか?
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"})
*/
protected $customers;
persist&remove
_cascade={"persist"}
_については正しいです。つまり、エンティティAを保持すると、Doctrineはコレクション内のすべてのBエンティティも保持します。
_cascade={"remove"}
_についても正しいです。つまり、エンティティAを削除すると、Doctrineはコレクション内のすべてのBエンティティも削除します。
ただし、この操作をすべてのBエンティティにカスケードするエンティティAを削除すると、それらのBエンティティが他のAエンティティに関連付けられる可能性があるため、ManyToManyアソシエーションでこれを使用したいとは思わないでしょう。
デタッチとマージ
あなたはnot _cascade={"detach"}
_および_cascade={"merge"}
_について正しい:
コレクションにエンティティを追加/削除することは、何かですyoする必要があります(コードで)。それについて読む こちら 。
Detachは、EntityManagerからエンティティを切り離すことを意味します。 EntityManagerはそのエンティティを管理しなくなります。これにより、デタッチされたエンティティは、既にデータベースに存在していることを除いて、新しくインスタンス化されたエンティティと同じになります(ただし、EntityManagerには認識させません)。
つまり、_cascade={"detach"}
_は、エンティティAをデタッチすると、Doctrineはコレクション内のすべてのBエンティティもデタッチします。
Mergeはdetachの反対です:切り離されたエンティティをEntityManagerにマージして戻します。merge()
は実際にnew管理対象オブジェクトを返すことに注意してください。渡された分離オブジェクトは管理対象外のままです。