作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为 Abono 的实体,它是其他几个实体(如 Cheque、Efectivo、Debito 等)的父类。在我的应用程序中,我使用具有如下 DQL 语句的存储库类来查询属于 Abono 类实例的所有对象(该代码是真实代码的简化版本):
$dql = "SELECT ab FROM FranquiciaBundle:Abono AS ab";
return $em->createQuery($dql)
->getResult();
在我的模板中,我显示的结果如下(再次简化代码):
{% for abono in abonos %}
<tr>
<td>{{ abono.id }}</td>
<td>{{ abono.tipo }}</td>
</tr>
{% endfor %}
我在该表上有 5000 条记录,分析器告诉我应用程序正在访问数据库 5000 次,而不是像我预期的那样只访问一次,因此我使用 getArrayResult() 稍微更改了 que 存储库
而不是 getResult()
但问题是句子 {{ abono.tipo }}
是对象的方法调用,而不是存储在数据库中的属性,因此它永远不会被水合到结果数组中。
所以我的问题是,如何让对象数组只访问数据库一次?
更新: Abono 类的方法 getTipo()
返回每个对象的 Late Static Binding 类名,它不是关联。
public function getTipo()
{
$className = get_called_class();
$pos = strrpos($className,'\\');
return substr($className, $pos+1);
}
最佳答案
好的,我找到了问题的根源。
看起来,当查询作为关联的反面的对象时, Doctrine 将始终获取这些实体来创建代理实例,即使这些实体不是 Controller 或模板中需要。因此,个人资料栏向我显示的对数据库的大量点击,实际上是 Doctrine 妨碍了我搜索我不需要的信息。
解决方案是在存储库中强制使用部分加载,如下所示:
$dql = "SELECT ab FROM FranquiciaBundle:Abono AS ab";
return $em->createQuery($dql)
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
->getResult();
更多信息可参见 here
关于symfony - 如何在 Symfony2 中优化 DQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14141247/
我是一名优秀的程序员,十分优秀!