我试图收集有关以下方式的一些信息,以在删除父实体时自动删除子实体。似乎最常见的方法是使用这三个注释之一:cascade={"remove"}
OR orphanRemoval=true
OR ondelete="CASCADE"
。
我对第三个有点困惑:ondelete="CASCADE"
,因为关于这个的教义官方文档中的解释非常少),如果有人可以确认我以下信息我会很高兴我收集并从我对网络的研究和经验中了解...
它有什么作用?
cascade={"remove"}
==>当拥有方实体是时,反向方的实体被删除。即使您与其他拥有方实体在 ManyToMany
中。
应该在集合上使用(所以在 OneToMany 或 ManyToMany 关系中)
ORM中的实现
orphanRemoval=true
==>当拥有方实体是并且它不再连接到任何其他拥有方实体时,反向方的实体将被删除。 (参考 doctrine official_doc
ORM中的实现
可与 OneToOne、OneToMany 或 ManyToMany 一起使用
onDelete="CASCADE"
==>这会将 On Delete Cascade 添加到数据库中的外键列
这种策略要正确有点棘手,但可以非常强大和快速。 (参考学说official_doc ...但没有阅读更多解释)
ORM 必须做的工作更少(与之前的两种方法相比),因此应该有更好的性能。
其他信息
所有这 3 种方式都是在双向关系实体上实现的(对吧???)
使用 cascade={"remove"} 完全绕过任何外键 onDelete=CASCADE。 (参考教义_official_doc)
如何在代码中使用它的示例
orphanRemoval 和 cascade={"remove"} 在逆实体类中定义。
ondelete="CASCADE" 在所有者实体中定义
您也可以只写 @ORM\JoinColumn(onDelete="CASCADE") 并让教义处理列名
级联={“删除”}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
孤儿移除=真
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
onDelete="级联"
/**
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/
protected $contact;
onDelete="CASCADE"
由数据库本身管理。 cascade={"remove"}
由学说管理。
onDelete="CASCADE"
更快,因为操作是在数据库级别执行的,而不是通过学说。删除是由数据库服务器而不是 Doctrine 执行的。对于 cascade={"remove"}
,原则必须管理实体本身,并将执行额外检查以查看它是否没有任何其他拥有实体。当不存在其他实体时,它将删除该实体。但这会产生开销。
级联={“删除”}
当拥有方实体是时,反向方的实体被删除。即使您与其他拥有方实体处于多对多关系中。不,如果该实体归其他人所有。它不会被删除。
应该在集合上使用(所以在 OneToMany 或 ManyToMany 关系中)
ORM中的实现
orphanRemoval="true"
当拥有方实体是并且它不再连接到任何其他拥有方实体时,反向方的实体将被删除。不完全是,这使得教义表现得好像它不属于其他实体,因此将其删除。
ORM中的实现
可与 OneToOne、OnetoMany 或 ManyToMany 一起使用
onDelete="级联"
这会将 On Delete Cascade 添加到数据库中的外键列
这种策略要正确有点棘手,但可以非常强大和快速。 (这是来自学说官方教程的引用......但没有看到更多解释)
ORM 要做的工作更少(与前两种方式相比),因此应该有更好的性能。