Cascade = {“删除”} VS orphanRemoval = true VS ondelete =“ CASCADE


92

我尝试收集一些有关以下方法的信息,这些方法是在删除父实体时自动删除子实体的。似乎最常见的方法是使用这三个注释之一:层叠= {“删除”} OR orphanRemoval = trueondelete =“ 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; 

Answers:


60

onDelete="CASCADE" 由数据库本身管理。 cascade={"remove"}由学说管理。

onDelete="CASCADE"更快,因为操作是在数据库级别而不是在理论上执行的。删除是由数据库服务器而不是Doctrine执行的。使用cascade={"remove"}原则必须管理实体本身,并将执行额外的检查以查看其是否没有其他拥有的实体。如果没有其他实体,它将删除该实体。但这会产生开销。


Cascade = {“删除”}

  • 当拥有方实体被删除时,相反方的实体将被删除。即使您与其他拥有附属实体存在众多关系。否,如果该实体由其他人拥有。它不会被删除。
  • 应该在集合上使用(因此在OneToMany或ManyToMany关系中)
  • 在ORM中实施

orphanRemoval =“ true”

  • 当拥有方实体为AND并且其不再与任何其他拥有方实体连接时,将删除相反方的实体。不完全是,这会使学说的行为像它不归其他实体所有一样,因此将其删除。
  • 在ORM中实施
  • 可以与OneToOne,OnetoMany或ManyToMany一起使用

onDelete =“ CASCADE”

  • 这会将“删除级联”添加到数据库中的外键列
  • 这种策略要正确一点点棘手,但它可能非常强大且快速。(这是从学说官方教程中引述的内容……但未见更多解释)
  • ORM要做的工作更少(与前两种方法相比),因此应该具有更好的性能。

3
@waaghals。关于您对级联的评论= {“删除”} ==>我在实体Article和Category之间有一个ManyToMany关系。当我删除文章($ em-> remove($ article);)时,即使这些类别也链接到其他文章,它也会删除链接到该文章的所有类别。所以我会说它不像您写的那样。
Alexis_D 2014年

2
@waaghals。关于您对orphanRemoval =“ true”的评论我在理论正式页面上引用了我写的一句话:“当拥有拥有权的实体被拥有,而没有任何其他实体拥有时,则删除了拥有相反实体的实体”。doctrine = orphanremoval
Alexis_D 2014年

1
@Alexis_D,完全同意您的意见答案不正确,对于新手来说真的很令人困惑
Stepan Yudin 16-4-12

3
我读过的更清晰的例子之一: gist.github.com/pylebecq/f844d1f6860241d8b025
Victor S

@VictorS的链接非常清楚。我不再使用Doctrine,因此感到无法在不了解第一手资料的情况下更新答案。如果有人可以更新我的答案,那将是很好的。
Waaghals
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.