使用Doctrine / MySQL进行“真正的”孤儿删除

时间:2017-09-28 08:33:54

标签: php mysql symfony doctrine-orm relational-database

我在Doctrine / MySQL项目中通过ManyToMany关系将两个实体链接在一起。

Client实体:

class Client
{
    [...]

    /**
     * @ORM\ManyToMany(targetEntity="ClientTag")
     * @ORM\JoinTable(name="clients_tags")

     */
    protected $tags;
}

ClientTag实体:

class ClientTag
{
    [...]

    /**
     * @ORM\Column(type="string", length=45)
     */
    protected $label;

    /**
     * @ORM\Column(type="string", length=7)
     */
    protected $color;
}

因此,我可以将多个客户端关联到一个标记,反之亦然,非常好。

但是,当没有更多客户引用它时,我找不到自动删除标记的方法

我尝试在orphanRemoval注释中使用ManyToMany,但它没有按照我的想法进行操作.. Orphan 删除应该意味着我上面所描述的内容但它会删除删除对其父项的引用时的标记,而不考虑我需要的其他实体。

如果客户端删除了一个标记但该标记仍由其他2个客户端使用,我不认为它是“ orphan ”,因为它仍然有一个或多个实体引用它。

当然,我可以通过查询来解决这个问题并在我找不到任何父项时自行删除它,但我想知道Doctrine或MySQL是否有内置的方法来实现这一点(这将更加优化) ?

有什么想法吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

官方orphanRemoval不支持ManyToMany关于学说的关系。

http://docs.doctrine-project.org/en/latest/reference/annotations-reference.html#annref-manytomany

在这种情况下,孤儿的移除是模棱两可的。 您可以将已删除实体的关系(可加入条目)理解为孤儿或相关实体。 从数据库的角度来看,它将是可连接的条目。 从ORM的角度来看,它是相关的实体。

根据用例,两种方式都是正确的。例如,在Article< - >中Category关系您希望在删除时删除所有关联类别的文章,但您不想因为此时它已空而丢弃整个类别。

我猜这就是为什么Doctrine没有正式提及orphanRemoval ManyToMany选项的原因,因为它不清楚并且完全支持两者变种目前的实施还不够。

希望这在某种程度上是可以理解的。 在您的情况下,您可能需要自己清理未使用的标签。