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 数据库允许我们获取标签的所有元数据,我终于找到了一个有效的解决方案:使关系成为单向的。
在我的 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 数据库允许我们获取标签的所有元数据,我终于找到了一个有效的解决方案:使关系成为单向的。