gpt4 book ai didi

php - 删除级联中的实体在多对多关系中不起作用

转载 作者:可可西里 更新时间:2023-11-01 06:52:24 25 4
gpt4 key购买 nike

我有一个父实体类别和一个子实体文章。它们由 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 ="级联").
绿色 从数据库中删除。

enter image description here

我的代码(部分代码)

在 Controller 中

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 种策略或那些删除必须在 Controller 中完成之外,还有其他方法吗?

最佳答案

据我所知,您不能仅使用级联功能来做到这一点。

一个干净的解决方案是创建一个订阅 preRemove 事件的监听器。然后,您可以检查某个类别何时被删除,并找到该类别中没有任何其他类别的所有文章,并将这些文章也删除。

关于php - 删除级联中的实体在多对多关系中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com