我尝试收集一些有关以下方法的信息,这些方法是在删除父实体时自动删除子实体的。似乎最常见的方法是使用这三个注释之一:层叠= {“删除”} OR orphanRemoval = true或ondelete =“ CASCADE”。
我对第三个混淆不清:ondelete =“ CASCADE”,因为在教义的官方文档中对此的解释非常稀缺),如果有人可以确认我从我的研究中收集并理解的以下信息,我将非常希望网络和经验...
它能做什么
Cascade = {“ remove”}
==>如果拥有拥有者实体,则删除拥有相反实体的实体。即使您与其他拥有的附属实体有很多关系。
-应该在集合上使用(因此在OneToMany或ManyToMany关系中使用)-ORM中的
实现
orphanRemoval = true
==>当拥有方实体为AND时,将删除反方的实体,并且该实体不再与任何其他拥有方实体连接。(参考 doctrine official_doc
-ORM中的实现
-可以与OneToOne,OnetoMany或ManyToMany一起使用
onDelete =“ CASCADE”
==>这会将On Delete Cascade添加到数据库中的外键列中
-这种策略有点棘手,但是可以非常强大和快速。(请 参阅doctrine official_doc ...,但尚未阅读更多说明)
-ORM要做的工作更少(与前两种方法相比),因此应该具有更好的性能。
其他信息
-所有这三种方式都是在双向关系实体上实现的(右???)
-使用cascade = {“ remove”}完全绕过onDelete = CASCADE上的任何外键。(参考doctrine_official_doc)
有关如何在代码中使用它的示例
- orphanRemoval和cascade = {“ remove”}在反向实体类中定义。
- 在所有者实体中定义了ondelete =“ CASCADE”
- 您还可以只编写@ORM \ JoinColumn(onDelete =“ CASCADE”)并让主义处理列名
Cascade = {“删除”}
/**
* @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;