【发布时间】:2015-02-14 21:31:15
【问题描述】:
我有一个父实体类别和一个子实体文章。它们由 ManyToMany 关系定义。一篇文章可以标记在一个或多个类别中,每个类别可以标记在多个文章中。
我想做什么
我希望当我删除一个类别时,该类别中标记的每篇文章也会被删除,但前提是它们没有被其他类别标记。
我已经测试过的内容
我测试了 2 个类别(id=1 和 id=2)和两篇文章(id=71 和 id=91)。
第 71 条同时具有第 1 类和第 2 类。第 91 条仅与第 2 类相关。
因此,在删除第 2 类时,我希望删除第 91 条而不是第 71 条(因为该条仍与 category_1 链接)
但是无论我尝试什么都没有发生...
在下图中,我总结了使用不同策略(1/cascade={"remove"}、2/orphanRemoval=true 和 3/ondelete ="级联")。
绿色从数据库中删除。
我的代码(部分代码)
在控制器中
public function deleteCategory(Category $category)
{
$em = $this->getDoctrine()->getManager();
$em->remove($category);
$em->flush();
}
对于策略 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;
对于策略 2/orphanRemoval=true
// IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION
* @ORM\ManyToMany(targetEntity="Article", inversedBy="categories", orphanRemoval=true)
private $articles;
// IN CLASS/ENTITY ARTICLE
* @ORM\ManyToMany(targetEntity="Category", mappedBy="articles")
private $categories;
对于策略 3/onDelete="CASCADE"
// IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION
* @ORM\ManyToMany(targetEntity="Article", inversedBy="categories")
private $articles;
// IN CLASS/ENTITY ARTICLE
* @ORM\ManyToMany(targetEntity="Category", mappedBy="articles")
* @ORM\JoinColumn(onDelete="CASCADE")
private $categories;
我的问题
除了我已经尝试过的 3 种策略或者必须在控制器中完成这些删除之外,还有其他方法吗?
【问题讨论】:
标签: php mysql symfony doctrine