Symfony 2 / Doctrine:如何在不失去ORM优势的情况下降低查询数量?

时间:2015-07-27 18:02:42

标签: php symfony orm doctrine twig

我使用 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中所见。是否有任何智能缓存选项可以检测我的情况并自动优化查询?

提前致谢!

2 个答案:

答案 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;您的相关数据(但它总是加载可能不是必需的数据)或使用查询构建器来加入相关的集合,它将被加载到一个查询中。但请记住,保持代码清洁 - 在存储库之外没有查询:)