performance - 在 twig 中显示 Doctrine 集合子集的有效方法
问题描述
我有一个 Symfony 实体,它有一个OneToMany
带有如下OrderBy
子句的映射:
/**
* @ORM\OneToMany(targetEntity="App\Entity\News", mappedBy="category", orphanRemoval=true)
* @ORM\OrderBy({"id" = "DESC"})
*/
private $news;
假设我只想n
在 Twig 中显示条目,我可以选择循环遍历它并忽略loop.index
n 之后的所有内容,或者使用slice。然而,这些选项确实有缺点,如果有很多新闻条目,它们都会被加载,这不是很有效。
另一种选择是在控制器或实体中使用标准来限制加载实体的数量。如果我在这里理解正确,它应该直接修改学说查询,因此不会对性能产生任何影响。这是最佳实践,还是在控制器中有一个自定义查询构建器或在存储库中有一个函数会更好?
解决方案
实际上,您可以将$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;
推荐阅读
- php - 我有连接到 MySQL 的 php 代码的问题
- google-cloud-dataprep - 格式为 yyyy-mm-dd HH:MM:SS 到日期时间的 Dataprep 字符串列
- ios - 如何在 iOS Ionic 应用程序中选择拨号器应用程序?
- assembly - 为什么这个 shellcode 会导致目标挂起?
- javascript - 无法将背景颜色值从 json 设置到 HTML 页面
- python - 如何在python中创建一个全局变量
- rxjs - 返回来自最近事件的响应,而不是最后的异步响应
- vue.js - Vue.js 生命周期钩子
- vue.js - 如何使用方法创建 Vue 组件的新实例并随后销毁它们?
- hadoop - Hadoop localhost:9870 在格式化 hdfs namenode 之前不起作用