我尝试收集一些有关以下方式的信息,以便在删除父实体时自动删除子实体。似乎最常见的方法是使用这三个注释中的一个: cascade = {“remove”} 或 orphanRemoval = true < / em>或 ondelete =“CASCADE” 。
我对第三个问题有点困惑: ondelete =“CASCADE” ,因为关于这个的官方文档中的解释非常稀缺)我会很高兴如果有人能够向我确认以下信息我从网上的研究和经验中收集并理解......
级联= { “去除”}
==&GT;当拥有方实体是时,删除反方的实体。即使你与其他拥有的实体有很多共同之处
- 应该用于收集(所以在OneToMany或ManyToMany关系中)
- 在ORM中实施
orphanRemoval =真
==&GT;当拥有方实体是AND时,反方面的实体被删除,它不再连接到任何其他拥有方实体。 (参考doctrine official_doc
- 在ORM中实施
- 可与OneToOne,OnetoMany或ManyToMany一起使用
onDelete = “CASCADE”
==&GT;这会将On Delete Cascade添加到数据库中的外键列
- 这个策略有点难以实现,但可以非常强大和快速。 (参考doctrine official_doc ......但还没有阅读更多解释)
- ORM必须做更少的工作(与之前的两种做法相比),因此应该有更好的表现。
其他信息
- 所有这3种做法都是在双向关系实体实施的( 对??? )上实施的
- 使用cascade = {“remove”}完全绕过任何外键onDelete = CASCADE。 (参考doctrine_official_doc)
级联= { “去除”}
/**
* @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;
答案 0 :(得分:51)
onDelete="CASCADE"
由数据库本身管理。 cascade={"remove"}
由学说管理。
onDelete="CASCADE"
更快,因为操作是在数据库级别而不是在学说上执行的。删除由数据库服务器执行,而不是Doctrine。使用cascade={"remove"}
原则必须管理实体本身并执行额外检查以查看它是否没有任何其他拥有实体。当没有其他存在时,它将删除该实体。但这会产生开销。
<强>级联= {&#34;除去&#34;} 强>
<强> orphanRemoval =&#34;真&#34; 强>
<强> onDelete =&#34; CASCADE&#34; 强>