我正在try 优化我的symfony项目,并想知道当我从控制器将实体对象传递给Twig模板时,实体对象是从数据库中完全获取(所有字段),还是只从模板中使用的字段中获取?

假设我有一个book实体,它有titleabstract个字段.在控制器中,我从各自的存储库中获取所有的book:

$books = $booksRepository->findAll();

然后将其传递给Twig模板:

return $this->render('books.html.twig', [
    'books' => $books
]);

然后,在books.html.twig中,我迭代了books对象,但只使用了title字段:

{% for book in books %}
    Title: {{ book.title }}<br>
{% endfor %}

我想知道symfony是否也在从数据库中读取abstract字段.当然,这是一个例子,生产项目可能会有拥有更多油田的实体.因此,我假设在某些网页上获取未使用的字段可能会给应用程序和数据库带来额外的负载.如果我最初的问题的答案是肯定的,那么我也对用来避免获取未使用的字段的技术感到好奇.

我试图调试symfony和Doctrine类,但最终在使用的类数量上迷路了,也找不到我的问题的答案.

推荐答案

此行为与symfony或Twig无关. 它与Doctrine 2和您在存储库中编写代码的方式有关.

当使用$books = $booksRepository->findAll();时,它将始终获取所有字段. 它将与所有本地教义的功能相同

find()
findOneBy()
findAll()
findBy()

如果您只需要字段子集,则必须使自定义存储库具有功能. 例如:

$query = $this->createQueryBuilder('book')->select('book.id, book.title, book.author');

调用它,而不是调用findAll().

但就个人而言,我并不完全同意

我假设在某些网页上获取未使用的字段可能会导致额外的 负荷

你必须考虑以毫秒为单位的绝对增益值.在大多数情况下,对于"小"实体,您的查询只查询字段的一个子集将获得0.000xxx毫秒. 因此,我建议您不要自动创建自定义存储库方法,因为加载/时间增益通常是无关紧要的,只有在出现性能不佳时才这样做.它将防止您创建大量需要在future 维护代码. 不要固守宗教,哈哈

Php相关问答推荐

PHP php_mongodb.dll for 32bit

以编程方式更改新订单、已取消订单和失败订单的邮箱WooCommerce通知

如何显示每个分类的当前术语的帖子中包含的前20个标签,不包括标签分类

Laravel POST方法返回状态:POST方法上不允许使用405方法

目标类[Set_Locale]不存在.拉威尔

我的邮箱中的链接在我的URL中添加了一个

返回WooCommerce中的所有已启用变体

如果所有请求都通过index.php路由,如何使用htaccess文件强制使用HTTPS?

对产品/库存结果集进行分组和计数,形成多维分层数组

如何在 Woocommerce 中自动删除旧的已完成订单

WooCommerce 相关产品(按 children 类别)作为排名数学主要类别的后备

循环中未序列化数组显示的问题

如何搜索和替换 XML 文件中的一段文本?

如何在PHP中对多个脚本调用进行排队?

在WooCommerce我的账户单个订单页面中添加订单商品部分和按钮

为 WordPress 页面创建新功能

如何在不解压缩/重新压缩的情况下连接(连接)两个缩小的值

Laravel 模型将日期保存为空

Laravel 从嵌套数组的第二级获取最后一项

Laravel 响应 html 默认页面忽略控制器