我想检查一下我对Doctrine关联的级联操作的理解。出于此问题的目的,我有两个模型: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;
答案 0 :(得分:133)
坚持&删除
你对cascade={"persist"}
的说法是正确的,这意味着持久化的实体A,Doctrine也会在集合中保留所有B实体。
您对cascade={"remove"}
也是正确的,这意味着删除实体A,Doctrine也会删除集合中的所有B实体。
但我怀疑你是否会想要在ManyToMany关联上使用它,因为当你删除将此操作级联到所有B实体的实体A时,那些B实体可能与其他A实体相关联。
分离&合并强>
cascade={"detach"}
和cascade={"merge"}
:
在集合中添加/删除实体是您需要做的事情(在您的代码中)。阅读here。
分离表示您从EntityManager中分离实体。 EntityManager将不再管理该实体。这使得分离的实体与新实例化的实体相同,除了它已经在数据库中(但是你让EntityManager不知道它)。
换句话说:cascade={"detach"}
表示分离实体A,Doctrine也会分离集合中的所有B实体。
合并与 detach 相反:您将分离的实体合并回EntityManager。
请注意merge()
实际上将返回新托管对象,您传递给它的分离对象仍然不受管理。