我尝试收集有关以下方式的一些信息,以便在删除父实体时自动删除子实体.似乎最常见的方法是使用这三个注释:cascade = {"remove"} OR orphanRemoval = true OR ondelete ="CASCADE".
我对第三个问题感到有点困惑:ondelete ="CASCADE",正如关于这个的官方文档中的解释非常稀缺)如果有人能够证实我从我的研究中收集和了解的以下信息,我会很高兴.网和经验......
cascade = {"remove"}
==>当拥有方实体为时,删除反面的实体.即使你与其他拥有的实体有许多不同之处.
- 应该用于集合(所以在OneToMany或ManyToMany关系中)
- 在ORM中实现
orphanRemoval = true
==>当拥有方实体为AND时,将删除反方的实体,并且它不再连接到任何其他拥有方实体.(参考 doctrine official_doc
- ORM中的实现
- 可以与OneToOne,OnetoMany或ManyToMany一起使用
onDelete ="CASCADE"
==>这会将删除级联添加到数据库中的外键列
- 这个策略有点难以实现,但可以非常强大和快速.(参见 doctrine official_doc ......但还没有阅读更多解释)
- ORM必须做的工作少(与之前的两种做法相比),因此应该有更好的表现.
其他信息
- 所有这三种方式都在双向关系实体实现(右???)
- 使用cascade = {"remove"}完全绕过任何外键onDelete = CASCADE.(参见doctrine_official_doc)
级联= { "去除"}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", …Run Code Online (Sandbox Code Playgroud) 无法删除或更新父行:外键约束失败.
class Teacher {
/**
*@ORM\OneToMany(targetEntity="publication", mappedBy="teacher")
*/
protected $publications;
}
class Publication {
/**
* @ORM\ManyToOne(targetEntity="Teacher", inversedBy="publications")
* @ORM\JoinColumn(name="teacher_id", referencedColumnName="id")
*/
protected $teacher;
}
Run Code Online (Sandbox Code Playgroud)
我想要的是,当你删除教师时,id_teacher被修改为NULL.我想保留出版物但不参考教授.
我不知道在Doctrine中是怎么做的,这可能吗?或者总是与老师的关系?
我有一个父实体类别和一个子实体文章.它们由ManyToMany关系定义.一篇文章可以在一个或多个类别中进行分类,每个类别可以在多个文章中进行标记.
我想做什么我
希望当我删除一个类别时,类别中标记的每个文章也被删除但是只有当它们没有被其他类别标记时.
我已经测试了什么我
测试了2类(id = 1和id = 2)和两篇文章(id = 71和id = 91).第71条同时具有第1类和第2类.第91条仅与第2类相关联.
因此,在删除第2 类时,我希望删除第91条而不删除第71条(因为这一条仍然与第1类相关)
但是,无论我尝试过什么,这都不会发生......
在下面的图片中,我总结了使用不同策略得到的结果(1/cascade = {"remove"},2/orphanRemoval = true和3/ondelete ="CASCADE").
以绿色从数据库中删除.

我的代码(部分代码)
在控制器中
public function deleteCategory(Category $category)
{
$em = $this->getDoctrine()->getManager();
$em->remove($category);
$em->flush();
}
Run Code Online (Sandbox Code Playgroud)
for strategy 1/cascade = {"remove"}
// IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION
* @ORM\ManyToMany(targetEntity="Article", inversedBy="categories", cascade={ "remove"})
private $articles;
// IN CLASS/ENTITY ARTICLE
* @ORM\ManyToMany(targetEntity="Category", mappedBy="articles")
private $categories;
Run Code Online (Sandbox Code Playgroud)
对于策略2/orphanRemoval = true
// IN CLASS/ENTITY CATEGORY - OWNER …Run Code Online (Sandbox Code Playgroud)