我试图收集有关以下方法的一些信息,以便在删除父实体时自动删除子实体。似乎最常见的方法是使用这三个注释之一: cascade={"remove"} OR orphanRemoval=true OR ondelete="CASCADE"
我对第三个有点困惑: ondelete="CASCADE" ,因为关于这个的 Doctrine 官方文档中的解释非常少),如果有人可以 向我确认以下信息 我从网上收集并了解我的研究和经验...
它有什么作用?cascade={"remove"}==>当拥有方实体是时,反向方的实体被删除。即使您与其他拥有方实体位于 ManyToMany 中。

  • 应该用于集合(所以在 OneToManyManyToMany 关系中)
  • 在 ORM 中的实现
  • orphanRemoval=true==>当拥有方实体是并且它不再连接到任何其他拥有方实体时,反向侧的实体被删除。 (引用 doctrine official_doc
  • 在 ORM 中的实现
  • 可以与 OneToOneOneToManyManyToMany
  • 一起使用
    onDelete="CASCADE"==> 这会将 On Delete Cascade 添加到数据库中的外键列
  • 这个策略做对有点棘手,但可以非常强大和快速。 (ref. 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="级联"
    /**
    * @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
    * @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
    */
    protected $contact;
    

    最佳答案

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

    级联={“删除”}

  • 拥有方实体删除时,反向实体被删除。即使您与其他拥有方的实体处于许多状态。 否,如果实体归其他人所有。它不会被删除。
  • 应该用于集合(所以在 OneToMany 或 ManyToMany 关系中)
  • 在 ORM 中的实现

  • orphanRemoval="true"
  • 当拥有方实体是并且它不再连接到任何其他拥有方实体时,反向侧的实体被删除。 不完全是,这使得 Doctrine 表现得好像它不属于其他实体,因此将其删除。
  • 在 ORM 中的实现
  • 可以与一对一、一对多或多对多一起使用

  • onDelete="级联"
  • 这会将 On Delete Cascade 添加到数据库中的外键列
  • 这个策略做对有点棘手,但可以非常强大和快速。 (这是 Doctrine 官方教程的引述……但没有看到更多解释)
  • ORM 必须做更少的工作(与前两种方式相比),因此应该有更好的性能。
  • 关于symfony - 级联= {"remove"} VS orphanRemoval=true VS ondelete="级联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27472538/

    10-16 16:23