Php 删除级联中不在多个关系中工作的实体
我有一个父实体类别和一个子实体文章。它们由许多关系定义。可以在一个或多个类别中标记一篇文章,并且可以在多篇文章中标记每个类别 我想做的事Php 删除级联中不在多个关系中工作的实体,php,mysql,symfony,doctrine,Php,Mysql,Symfony,Doctrine,我有一个父实体类别和一个子实体文章。它们由许多关系定义。可以在一个或多个类别中标记一篇文章,并且可以在多篇文章中标记每个类别 我想做的事 我希望当我删除一个类别时,该类别中标记的每一篇文章也会被删除,但前提是它们没有被其他类别标记 我已经测试过的内容 我测试了两个类别(id=1和id=2)和两篇文章(id=71和id=91)。 第七十一条包括第一类和第二类。第91条仅与第2类相关。 因此,在删除第2类时,我希望删除第91条,而不是第71条(因为这一条仍然与第1类相关) 但无论我怎么努力,这些都没
我希望当我删除一个类别时,该类别中标记的每一篇文章也会被删除,但前提是它们没有被其他类别标记 我已经测试过的内容
我测试了两个类别(id=1和id=2)和两篇文章(id=71和id=91)。 第七十一条包括第一类和第二类。第91条仅与第2类相关。
因此,在删除第2类时,我希望删除第91条,而不是第71条(因为这一条仍然与第1类相关) 但无论我怎么努力,这些都没有发生 在下图中,我总结了使用不同策略得到的结果(1/cascade={“remove”},2/orphandremove=true和3/ondelete=“cascade”)。
在绿色中从数据库中删除 我的代码(代码的一部分) 在控制器中 对于策略1/cascade={“删除”} 对于策略2/删除=true 对于策略3/onDelete=“CASCADE” 我的问题
除了我已经尝试过的3种策略或那些删除操作必须在控制器中完成外,还有其他方法吗 就我所能想到的,仅仅使用级联功能是无法做到这一点的 一个干净的解决方案是创建一个订阅
preRemove
事件的侦听器。
然后,您可以检查某个类别何时被删除,并查找该类别中没有任何其他类别的所有文章,并将其删除。ok Waaghals我将尝试事件,或者直接在控制器中执行(直接在控制器中执行此操作没有错?对吗?)
public function deleteCategory(Category $category)
{
$em = $this->getDoctrine()->getManager();
$em->remove($category);
$em->flush();
}
// 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;
// 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;
// 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;