我正在尝试优化我的Symfony项目,想知道当我从控制器将实体对象传递到Twig模板时,是否会从数据库中完全获取(所有字段)该对象,还是仅获取在模板中使用的字段?
假设我有一个书籍实体,它具有标题和摘要字段。在控制器中,我从相应的存储库中获取所有书籍:
我想知道Symfony是否也从数据库中读取
我尝试调试Symfony和Doctrine类,但最终在使用的类数量中迷失了方向,找不到答案。
假设我有一个书籍实体,它具有标题和摘要字段。在控制器中,我从相应的存储库中获取所有书籍:
$books = $booksRepository->findAll();
然后将其传递给Twig模板:
return $this->render('books.html.twig', [
'books' => $books
]);
接下来,在books.html.twig
中,我仅使用title
字段遍历books
对象:
{% for book in books %}
Title: {{ book.title }}<br>
{% endfor %}
我想知道Symfony是否也从数据库中读取
abstract
字段。当然,这只是一个例子,生产项目可能有更多字段的实体。因此,我认为在某些网页上获取未使用的字段可能会给应用程序和数据库带来额外的负载。如果我的初始问题的答案是肯定的,我还想知道用于避免获取未使用字段的技术。我尝试调试Symfony和Doctrine类,但最终在使用的类数量中迷失了方向,找不到答案。
$books = $booksRepository->findAll();
,Doctrine 就会从数据库中调用所有书籍的数据,并将其全部填充。如果您的数据库中有很多书籍,则 PHP/Doctrine 将使用大量内存。如果要避免这种情况:不要加载所有书籍(切割和分片),或者如果您需要在响应中使用它们所有,可以像 @Cerad 建议的那样使用部分。无论如何,在 Twig 渲染之前,您都可以使用专用缓存层来存储标题数组,而不是提供所有填充的书籍。存储标题并避免调用 findAll() 方法。 - Alexandre Tranchant