首页 > 解决方案 > 在 twig 中显示 Doctrine 集合子集的有效方法

问题描述

我有一个 Symfony 实体,它有一个OneToMany带有如下OrderBy子句的映射:

/**
 * @ORM\OneToMany(targetEntity="App\Entity\News", mappedBy="category", orphanRemoval=true)
 * @ORM\OrderBy({"id" = "DESC"})
 */
private $news;

假设我只想n在 Twig 中显示条目,我可以选择循环遍历它并忽略loop.indexn 之后的所有内容,或者使用slice。然而,这些选项确实有缺点,如果有很多新闻条目,它们都会被加载,这不是很有效。

另一种选择是在控制器或实体中使用标准来限制加载实体的数量。如果我在这里理解正确,它应该直接修改学说查询,因此不会对性能产生任何影响。这是最佳实践,还是在控制器中有一个自定义查询构建器或在存储库中有一个函数会更好?

标签: performancesymfonydoctrine

解决方案


实际上,您可以将$news关系设置为EXTRA_LAZY并使用$news->slice()函数,而不会触发官方文档中所述的完全加载:

如果您将关联标记为额外惰性,则可以调用集合上的以下方法,而不会触发集合的完全加载:

Collection#contains($entity)
Collection#containsKey($key) (available with Doctrine 2.5)
Collection#count()
Collection#get($key) (available with Doctrine 2.4)
Collection#slice($offset, $length = null)

因此,您的声明应如下所示:

/**
 * @ORM\OneToMany(targetEntity="App\Entity\News", mappedBy="category", orphanRemoval=true, fetch="EXTRA_LAZY")
 * @ORM\OrderBy({"id" = "DESC"})
 */
private $news;

推荐阅读