ChatGPT解决这个技术问题 Extra ChatGPT

级联={“删除”} VS orphanRemoval=true VS ondelete="CASCADE

我试图收集有关以下方式的一些信息,以在删除父实体时自动删除子实体。似乎最常见的方法是使用这三个注释之一: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; 
它有一个很好的解释stackoverflow.com/questions/25515007/…

W
Waaghals

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

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

级联={“删除”}

当拥有方实体是时,反向方的实体被删除。即使您与其他拥有方实体处于多对多关系中。不,如果该实体归其他人所有。它不会被删除。

应该在集合上使用(所以在 OneToMany 或 ManyToMany 关系中)

ORM中的实现

orphanRemoval="true"

当拥有方实体是并且它不再连接到任何其他拥有方实体时,反向方的实体将被删除。不完全是,这使得教义表现得好像它不属于其他实体,因此将其删除。

ORM中的实现

可与 OneToOne、OnetoMany 或 ManyToMany 一起使用

onDelete="级联"

这会将 On Delete Cascade 添加到数据库中的外键列

这种策略要正确有点棘手,但可以非常强大和快速。 (这是来自学说官方教程的引用......但没有看到更多解释)

ORM 要做的工作更少(与前两种方式相比),因此应该有更好的性能。


@waaghals。关于您对 cascade={"remove"} 的评论 ==> 我在实体文章和类别之间存在多对多关系。当我删除一篇文章 ($em->remove($article);) 时,它会删除所有链接到这篇文章的类别,即使这些类别也链接到其他文章。所以我会说它不像你写的那样表现。
@waaghals。关于您对 orphanRemoval="true" 的评论 我写的那句话“当拥有方实体是时,反面的实体被删除,并且它不被任何其他实体拥有”引用自学说官方页面。 doctrine=orphanremoval
@Alexis_D,完全同意您的评论答案不正确,新手可能会感到困惑
我读过的更清晰的例子之一:gist.github.com/pylebecq/f844d1f6860241d8b025
@VictorS 的链接非常清楚。我不再使用 Doctrine,所以如果不知道第一手资料是如何工作的,我就无法更新我的答案。如果有人可以更新我的答案,那就太好了。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅