cascade = {"删除"} VS orphanRemoval = true VS ondelete =" CASCADE

时间:2014-12-14 18:26:45

标签: symfony doctrine entity cascade

我尝试收集一些有关以下方式的信息,以便在删除父实体时自动删除子实体。似乎最常见的方法是使用这三个注释中的一个: cascade = {“remove”} orphanRemoval = true < / em>或 ondelete =“CASCADE”

对第三个问题有点困惑: ondelete =“CASCADE” ,因为关于这个的官方文档中的解释非常稀缺)我会很高兴如果有人能够向我确认以下信息我从网上的研究和经验中收集并理解......

它做了什么

级联= { “去除”}
==&GT;当拥有方实体是时,删除反方的实体。即使你与其他拥有的实体有很多共同之处 - 应该用于收集(所以在OneToMany或ManyToMany关系中)
- 在ORM中实施

orphanRemoval =真
==&GT;当拥有方实体是AND时,反方面的实体被删除,它不再连接到任何其他拥有方实体。 (参考doctrine official_doc - 在ORM中实施
- 可与OneToOne,OnetoMany或ManyToMany一起使用

onDelete = “CASCADE”
==&GT;这会将On Delete Cascade添加到数据库中的外键列 - 这个策略有点难以实现,但可以非常强大和快速。 (参考doctrine official_doc ......但还没有阅读更多解释)
- ORM必须做更少的工作(与之前的两种做法相比),因此应该有更好的表现。

其他信息
- 所有这3种做法都是在双向关系实体实施的( 对??? )上实施的 - 使用cascade = {“remove”}完全绕过任何外键onDelete = CASCADE。 (参考doctrine_official_doc

如何在代码中使用它的示例

  • orphanRemoval和cascade = {“remove”}在反转的实体类中定义。
  • ondelete =“CASCADE”在所有者实体中定义
  • 你也可以写@ORM \ JoinColumn(onDelete =“CASCADE”)并让doctrine处理列名

级联= { “去除”}

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers

orphanRemoval =真

/**
* @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; 

1 个答案:

答案 0 :(得分:51)

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

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


<强>级联= {&#34;除去&#34;}

  • 当拥有方实体是时,删除反面的实体。即使你与其他拥有的实体有许多不同之处。 不,如果该实体归其他所有者所有。它不会被删除。
  • 应该用于收集(所以在OneToMany或ManyToMany关系中)
  • 在ORM中实施

<强> orphanRemoval =&#34;真&#34;

  • 当拥有方实体为AND时,将删除反方的实体,并且它不再连接到任何其他拥有方实体。 不完全是这样,这使得教义的行为就像它不归其他实体所有,从而将其删除。
  • 在ORM中实施
  • 可与OneToOne,OnetoMany或ManyToMany
  • 一起使用

<强> onDelete =&#34; CASCADE&#34;

  • 这会将删除级联添加到外键列IN THE DATABASE
  • 这个策略有点难以正确,但可以非常强大和快速。 (这是学说官方教程的引用......但是没有看到更多的解释)
  • ORM必须做更少的工作(与之前的两种做法相比),因此应该有更好的表现。