我试图收集有关以下方法的一些信息,以便在删除父实体时自动删除子实体。似乎最常见的方法是使用这三个注释之一: cascade={"remove"}
OR orphanRemoval=true
OR ondelete="CASCADE"
。
我对第三个有点困惑: ondelete="CASCADE"
,因为关于这个的 Doctrine 官方文档中的解释非常少),如果有人可以 向我确认以下信息 我从网上收集并了解我的研究和经验...
它有什么作用?cascade={"remove"}
==>当拥有方实体是时,反向方的实体被删除。即使您与其他拥有方实体位于 ManyToMany
中。
OneToMany
或 ManyToMany
关系中) orphanRemoval=true
==>当拥有方实体是并且它不再连接到任何其他拥有方实体时,反向侧的实体被删除。 (引用 doctrine official_docOneToOne
、OneToMany
或 ManyToMany
onDelete="CASCADE"
==> 这会将 On Delete Cascade 添加到数据库中的外键列其他信息
cascade={"remove"}
完全绕过任何外键 onDelete=CASCADE。 (引用 doctrine_official_doc ) 如何在代码中使用它的示例
orphanRemoval
和 cascade={"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 必须管理实体本身,并将执行额外检查以查看它是否没有任何其他拥有实体。当不存在其他实体时,它将删除该实体。但这会产生开销。
级联={“删除”}
orphanRemoval="true"
onDelete="级联"
关于symfony - 级联= {"remove"} VS orphanRemoval=true VS ondelete="级联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27472538/