cascade = {“remove”} VS orphanRemoval = true VS ondelete =“CASCADE

我试图收集一些关于以下方法的信息,以便在父实体被删除时自动删除子实体。 似乎最常用的方法是使用这三个注释: cascade = {“remove”}orphanRemoval = trueondelete =“CASCADE”

关于第三个问题,有点困惑: ondelete =“CASCADE” ,正如关于这个主题官方文档的解释非常稀缺),如果有人能够证实我从我的研究中收集和理解的以下信息 ,networking和经验…

它能做什么

级联= { “去除”}
==>当拥有边实体时,反面的实体被删除。 即使你和其他拥有一方的实体在许多方面。
– 应该用于收集(所以在OneToMany或ManyToMany关系)
– 在ORM中实现

orphanRemoval =真
==>反面的实体被删除当拥有边实体是和它不再连接到任何其他拥有的一方实体。 (参考doctrine official_doc – 在ORM中的实现
– 可以与OneToOne,OnetoMany或ManyToMany一起使用

onDelete = “CASCADE”
==>这会将On Delete Cascade添加到数据库中的外键列
– 这个策略有点棘手,但可以非常强大和快速。 (参考doctrine official_doc …但没有读更多的解释)
– ORM不得不做更less的工作(与之前的两个做法相比),因此应该有更好的performance。

其他信息
– 所有这三种方式都是在双向关系实体( right ??? )上实现的
– 使用cascade = {“remove”}完全通过任何外键onDelete = CASCADE。 (ref。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; 

onDelete="CASCADE"由数据库本身pipe理。 cascade={"remove"}由教条pipe理。

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


级联= { “去除”}

  • 当拥有边实体时,反面的实体被删除。 即使你和其他拥有一方的实体在许多方面。 不,如果实体由其他东西所拥有。 它不会被删除。
  • 应该用于收集(所以在OneToMany或ManyToMany关系)
  • 在ORM中实现

orphanRemoval = “真”

  • 当拥有边实体为“与”时,反面的实体被删除,而不再与其他任何拥有边实体连接。 不完全是这样,这使得教条的行为像它不是由其他实体拥有,并因此将其删除。
  • 在ORM中实现
  • 可以与OneToOne,OnetoMany或ManyToMany一起使用

onDelete = “CASCADE”

  • 这会将On Delete Cascade添加到数据库中的外键列
  • 这个策略有点棘手,但可以非常强大和快速。 (这是来自主义官方教程的引用…但没有看到更多的解释)
  • ORM不得不做更less的工作(与之前的两种做法相比),因此应该有更好的performance。