我想检查一下我对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;
Run Code Online (Sandbox Code Playgroud)
如果我定义了逆许多人的之间有很多关系Insuree
,并Customer
与集cascade{"all"}
,我明白,这将:
这是关联的定义Insurees
.
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"})
*/
protected $customers;
Run Code Online (Sandbox Code Playgroud)
如果我然后定义关于级联保持,合并和分离的关系 - 删除保险人将不会删除所有相关客户 - 它只会删除保险公司与其客户之间的关联?
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"})
*/
protected $customers;
Run Code Online (Sandbox Code Playgroud)
Jas*_*wer 140
坚持和删除
关于cascade={"persist"}
持久化实体A,Doctrine还将保留Collection中所有B实体的含义是正确的.
你也cascade={"remove"}
意味着删除实体A,Doctrine也会删除Collection中的所有B实体.
但我怀疑你是否会想要在ManyToMany关联上使用它,因为当你删除将此操作级联到所有B实体的实体A时,那些B实体可能与其他A实体相关联.
分离和合并
你不正确cascade={"detach"}
和cascade={"merge"}
:
在集合中添加/删除实体是您需要做的(在您的代码中).在这里阅读.
分离意味着您将实体与EntityManager分离.EntityManager将不再管理该实体.这使得分离的实体与新实例化的实体相同,除了它已经在数据库中(但是你使EntityManager不知道它).
换句话说:cascade={"detach"}
意味着分离实体A,Doctrine也将分离集合中的所有B实体.
合并与分离相反:您将分离的实体合并回EntityManager.
请注意,merge()
实际上会返回一个新的托管对象,传递给它的分离对象仍然是不受管理的.