Symfony cascade={quot;remove";}VS孤立删除=true VS ondelete=";大量

Symfony cascade={quot;remove";}VS孤立删除=true VS ondelete=";大量,symfony,doctrine,entity,cascade,Symfony,Doctrine,Entity,Cascade,我试图收集以下信息,以便在删除父实体时自动删除子实体。似乎最常见的方法是使用这三种注释中的一种:cascade={“remove”}或orphandremove=true或ondelete=“cascade” 我对第三个有点困惑:ondelete=“CASCADE”,因为官方文件中关于这一个的解释非常稀少),如果有人能证实我从网上的研究和经验中收集并理解的以下信息,我将非常高兴 它有什么作用 cascade={“remove”} ==>当拥有方实体被删除时,反向侧的实体被删除。即使您与另一方实体

我试图收集以下信息,以便在删除父实体时自动删除子实体。似乎最常见的方法是使用这三种注释中的一种:
cascade={“remove”}
orphandremove=true
ondelete=“cascade”

我对第三个有点困惑:
ondelete=“CASCADE”
,因为官方文件中关于这一个的解释非常稀少),如果有人能证实我从网上的研究和经验中收集并理解的以下信息,我将非常高兴

它有什么作用

cascade={“remove”}
==>当拥有方实体被删除时,反向侧的实体被删除。即使您与另一方实体处于
manytomy

  • 应用于收集(因此在
    OneToMany
    ManyToMany
    关系中)
  • ORM中的实现
删除=真
==>当拥有方实体被删除且不再连接到任何其他拥有方实体时,反向侧的实体将被删除。(参考

  • ORM中的实现
  • 可与
    OneToOne
    OneToMany
    ManyToMany
onDelete=“CASCADE”
==>这将向数据库中的外键列添加删除级联

  • 这个策略有点棘手,但可能非常强大和快速。(参考…,但没有阅读更多解释)
  • ORM必须做更少的工作(与前两种方法相比),因此应该有更好的性能
其他信息

  • 所有这三种方法都在双向关系实体上实现(对吗?
  • 使用
    cascade={“remove”}
    完全通过任何外键onDelete=cascade。(参考)
关于如何在代码中使用它的示例
  • orphaneremove
    cascade={“remove”}
    在反向实体类中定义
  • ondelete=“CASCADE”
    在所有者实体中定义
  • 您也可以只编写
    @ORM\JoinColumn(onDelete=“CASCADE”)
    ,让doctrine处理列名
cascade={“remove”}

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

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
onDelete=“CASCADE”

onDelete=“CASCADE”
由数据库本身管理。
CASCADE={“remove”}
由条令管理

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


cascade={“remove”}

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
  • 当拥有方实体为时,反向方的实体将被删除。即使您与其他拥有方实体处于多个实体中。否,如果该实体为其他实体所有,则不会被删除。
  • 应在收集时使用(因此在一对一或多对多关系中)
  • ORM中的实现
删除=“true”

  • 当拥有方实体被删除且不再与任何其他拥有方实体连接时,反向方的实体将被删除。不完全是这样,这会使条令表现为不属于其他实体,从而将其删除。
  • ORM中的实现
  • 可与OneToOne、OnetoMany或ManyToMany一起使用
onDelete=“CASCADE”

  • 这将向数据库中的外键列添加删除级联
  • 这个策略有点棘手,但可能非常强大和快速。(这是一段引用自官方教程的话……但没有看到更多的解释)
  • ORM必须做更少的工作(与前两种方法相比),因此应该有更好的性能

它对@waaghals有很好的解释。关于你对cascade的评论={“remove”}=>我在实体文章和类别之间有很多关系。当我删除一篇文章($em->remove($Article);)它确实会删除与本文链接的所有类别,即使这些类别也与其他文章链接。因此,我想说,它的行为与您所写的不同。@waaghals.About您对我所写句子的评论remove=“true”“当拥有方实体为时,反向方的实体将被删除,并且它不属于任何其他实体"引用自条令官方网页。@Alexis_D,完全同意你的评论答案是错误的,可能会让新手感到困惑。我读过一个更清楚的例子:@VictorS'链接非常清楚。我不再使用条令,所以我觉得我无法在不知道它如何工作的情况下更新我的答案。如果有人能够更新我的答案我的回答太好了。