我使用 Symfony 2.7 与 Doctrine 。我的控制器操作通常如下:
# my/namespace/Controller/ItemsController.php -> listAction()
$items = $this->get('repository.items')->findAll();
return $this->render('itemsList.html.twig', array('items' => $items));
在我的模板中,我喜欢迭代关联的实体:
# my/namespace/Resources/views/itemsList.html.twig
{% for item in items %}
Item: {{ item.name }} <br/>
Groups: <br/>
<ul>
{% for group in item.groups %}
<li>{{ group.name }}</li>
{% endfor %}
</ul>
{% endfor %}
这导致许多SELECT-queries ,我想避免。到目前为止,我所知道的唯一解决方案是收集repository
中所有需要的数据并在action
中分配,而不是在模板内抓取。
我希望保持这种方式,如在twig-snippet中所见。是否有任何智能缓存选项可以检测我的情况并自动优化查询?
提前致谢!
答案 0 :(得分:3)
正如其他人所说,您应该获取存储库中的组实体。你可以使用这样的东西:
//inside the repository
public function findAllFetchGroups(){
return $this->createQueryBuilder('a')
->addSelect('gs')->join('a.groups', 'gs')
->getQuery()->getResult();
}
答案 1 :(得分:1)
有两种方法可以完成目标。你可以获取=&#34; EAGER&#34;您的相关数据(但它总是加载可能不是必需的数据)或使用查询构建器来加入相关的集合,它将被加载到一个查询中。但请记住,保持代码清洁 - 在存储库之外没有查询:)