symfony - 级联= {"remove"} VS orphanRemoval=true VS ondelete="CASCADE

标签 symfony doctrine entity cascade

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

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

它有什么作用?

cascade={"remove"} ==> 当拥有方实体存在时,反方实体被删除。即使您处于 ManyToMany与其他拥有方实体。

  • 应该用于集合(因此在 OneToManyManyToMany 关系中)
  • ORM 中的实现

orphanRemoval=true ==> 当拥有方实体并且不再连接到任何其他拥有方实体时,反面的实体将被删除。 (引用doctrine official_doc

  • ORM 中的实现
  • 可与 OneToOne 一起使用, OneToManyManyToMany

onDelete="CASCADE" ==> 这会将 OnDeleteCascade 添加到数据库中的外键列

  • 这个策略的正确实现有点棘手,但非常强大且快速。 (引用doctrine official_doc ...但还没有阅读更多解释)
  • ORM 需要做的工作更少(与之前的两种方法相比),因此应该具有更好的性能。

其他信息

  • 所有这 3 种方法都是在双向关系实体上实现的(对吗???)
  • 使用 cascade={"remove"}完全绕过任何外键 onDelete=CASCADE。 (引用doctrine_official_doc)

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

  • orphanRemovalcascade={"remove"}定义在逆实体类中。
  • ondelete="CASCADE"在所有者实体中定义
  • 您也可以只写 @ORM\JoinColumn(onDelete="CASCADE")并让 Doctrine 处理列名称

级联={"删除"}

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

orphanRemoval=true

/**
* @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" 由数据库本身管理。 cascade={"remove"} 由 Doctrine 管理。

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

<小时/>

级联={"删除"}

  • 当拥有方实体被删除时,相反方的实体也被删除。即使您与其他拥有方实体处于多方关系中。 不可以,如果该实体为其他实体所有。它不会被删除。
  • 应该用于集合(因此在 OneToMany 或 ManyToMany 关系中)
  • ORM 中的实现

orphanRemoval="true"

  • 当拥有方实体并且不再连接到任何其他拥有方实体时,反面的实体将被删除。 不完全是这样,这使得 Doctrine 表现得好像它不属于其他实体,因此将其删除。
  • ORM 中的实现
  • 可与 OneToOne、OnetoMany 或 ManyToMany 一起使用

onDelete="CASCADE"

  • 这会将“删除级联”添加到数据库中的外键列
  • 这个策略的正确实现有点棘手,但非常强大且快速。 (这是来自 Doctrine 官方教程的引用...但还没有看到更多解释)
  • ORM 需要做的工作更少(与之前的两种方式相比),因此应该具有更好的性能。

关于symfony - 级联= {"remove"} VS orphanRemoval=true VS ondelete="CASCADE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27472538/

相关文章:

PHPUnit 测试写入文件的函数并将内容检查到创建的文件中

java - src/test/中的 IntelliJ Idea JPA 实体

php - Symfony2 实体集合 - 如何添加/删除与现有实体的关联?

php - 具有连接的 Doctrine 查询构建器返回实体数组而不是分组结果

php - 从 Doctrine 地理记录中的给定坐标获取距离

sql-server - Doctrine + SQL Server 存储过程

java - 在 hibernate 中映射 PostgreSQL LTREE 列时出错

symfony - Twig,过滤一个循环

php - Symfony/查询生成器 : "myEntityAlias.myEntity.id" <- possible?

php - 每个包一个 parameters.yml,symfony2