Symfony - ManytoMany 关系刷新时的内存问题

Symfony - Memory problem on flush for ManytoMany relations

在我的 symfony 项目(5.x 版本)中,我在 Metas 和 Tags 之间有一个简单的多对多关系(没有定义 fetch 和 cascade)。

class Meta
{
    ...

    /**
     * @ORM\ManyToMany(targetEntity="Tag", mappedBy="meta")
     * @ORM\OrderBy({"name" = "ASC"})
     */
    protected $tags;
}
class Tag
{
    ...

    /**
     * @ORM\ManyToMany(targetEntity="Meta", inversedBy="tags")
     * @ORM\JoinTable(name="app_meta_tag")
     * @ORM\JoinColumn(name="meta_id")
     */
    protected $meta;
}

我可以拥有 40 000 个具有相同标签(例如“test”)的元数据。

当我将“测试”标签添加到 Meta 中,然后持久化并刷新时,与此标签相关的所有 Meta 都被刷新...并且 return 由于内存限制出现 500 错误。 这种行为似乎与教义文档相矛盾:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/working-with-associations.html#persistence-by-reachability-cascade-persist

有人可以解释一下吗? 谢谢!

当你在 Doctrine 中关联两个实体时,你有一个拥有方和一个反面,在更新拥有方时,Doctrine 将保存所有链接的反面。在相反的情况下,什么都不会被保存。

这里的拥有方是 Tag (inversed-by="tags"),这意味着更新只会在您更新 Tag 时发生。

您应该反转 mappedBy 和 inversedBy 目标 class。

由于我们有一个 elasticsearch 数据库允许我们获取标签的所有元数据,我终于找到了一个有效的解决方案:使关系成为单向的。

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional