cascade = {"remove"} VS orphanRemoval = true VS ondelete ="CASCADE

Ale*_*s_D 89 entity doctrine cascade symfony

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

对第三个问题感到有点困惑:ondelete ="CASCADE",正如关于这个的官方文档中的解释非常稀缺)如果有人能够证实我从我的研究中收集和了解的以下信息,我会很高兴.网和经验......

它能做什么

cascade = {"remove"}
==>当拥有方实体为时,删除反面的实体.即使你与其他拥有的实体有许多不同之处.
- 应该用于集合(所以在OneToMany或ManyToMany关系中)
- 在ORM中实现

orphanRemoval = true
==>当拥有方实体为AND时,将删除反方的实体,并且它不再连接到任何其他拥有方实体.(参考 doctrine official_doc - ORM中的实现
- 可以与OneToOne,OnetoMany或ManyToMany一起使用

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

其他信息
- 所有这三种方式都在双向关系实体实现(右???)
- 使用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
Run Code Online (Sandbox Code Playgroud)

orphanRemoval =真

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
Run Code Online (Sandbox Code Playgroud)

onDelete = "CASCADE"

/** 
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/ 
protected $contact; 
Run Code Online (Sandbox Code Playgroud)

Waa*_*als 56

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

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


级联= { "去除"}

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

orphanRemoval = "真"

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

onDelete = "CASCADE"

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

  • @ waaghals.关于您对cascade的评论= {"remove"} ==>我在实体文章和类别之间有一个ManyToMany关系.当我删除文章($ em-> remove($ article);)时,如果这些类别也链接到其他文章,它会删除链接到本文的所有类别.所以我会说它不像你写的那样表现. (3认同)
  • 我读过的一个更清晰的例子:https://gist.github.com/pylebecq/f844d1f6860241d8b025 (3认同)
  • @ waaghals.关于你对orphanRemoval ="true"的评论我写的"当所有方实体是,并且它不属于任何其他实体时,被反对的实体被删除"的句子是从学说官方页面引用的.[教义= orphanremoval](http://doctrine-orm.readthedocs.org/en/latest/reference/xml-mapping.html?highlight=orphanremoval). (2认同)
  • @Alexis_D,完全同意你的评论答案不正确,对于新手来说真的很困惑 (2认同)