【问题标题】:Symfony - Memory problem on flush for ManytoMany relationsSymfony - 多对多关系刷新时的内存问题
【发布时间】:2020-10-13 15:03:52
【问题描述】:

在我的 symfony 项目(5.x 版本)中,我在 Metas 和 Tags 之间有一个简单的 ManyToMany 关系(没有定义 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 都被刷新......并由于内存限制而返回 500 错误。 这种行为似乎与教义文档相矛盾:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/working-with-associations.html#persistence-by-reachability-cascade-persist

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

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

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

    这里的拥有方是标签(inversed-by="tags"),这意味着只有更新标签才会发生更新。

    你应该反转 mappedBy 和 inversedBy 目标类。

    【讨论】:

    • 我在反转关系时仍然遇到内存问题。
    【解决方案2】:

    由于我们有一个弹性搜索数据库,允许我们获取标签的所有元数据,我终于找到了一个可行的解决方案:使关系单向。

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

    【讨论】:

      猜你喜欢
      • 2020-03-02
      • 1970-01-01
      • 2011-06-18
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      相关资源
      最近更新 更多