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

Php Symfony 2/Doctrine:如何在不失去ORM优势的情况下降低查询数量?,php,symfony,orm,doctrine,twig,Php,Symfony,Orm,Doctrine,Twig,我正在将Symfony 2.7与原则一起使用。我的控制器操作通常如下所示: # my/namespace/Controller/ItemsController.php -> listAction() $items = $this->get('repository.items')->findAll(); return $this->render('itemsList.html.twig', array('items' => $items)); 在我的模板中,我喜欢

我正在将Symfony 2.7与原则一起使用。我的控制器操作通常如下所示:

# 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 %}
#my/namespace/Resources/views/itemsList.html.twig
{items%%中的项的%s}
项目:{{Item.name}}
组:
    {item.groups%中的组的%s}
  • {{group.name}
  • {%endfor%}
{%endfor%}
这会导致许多SELECT查询,我希望避免这些查询。到目前为止,我知道的唯一解决方案是在
存储库中收集所有需要的数据,并在
操作中分配数据,而不是在模板中爬行

我想保持这种方式,如细枝片段所示。是否有任何智能缓存选项可以检测像我这样的案例并自动优化查询


提前谢谢

实现目标有两种方法。您可以获取相关数据(但它总是加载可能不是必需的数据),或者使用查询生成器加入相关集合,它将在一个查询中加载。但是请记住,为了保持代码干净-存储库之外没有查询:)

正如其他人所说,您应该获取存储库中的组实体。您可以使用以下内容:

//inside the repository
public function findAllFetchGroups(){

  return $this->createQueryBuilder('a')
    ->addSelect('gs')->join('a.groups', 'gs')
    ->getQuery()->getResult();
}

您是否尝试过快速加载,即
fetch=“eager”
?您是否尝试过编写自己的存储库方法,witch也加入并选择组?@FuzzyTree
fetch=“eager”
在某些情况下有效,谢谢!我试图谨慎地使用它,并且更喜欢我自己的存储库方法,并辅以
fetch=“EAGER”
“存储库外无查询”
——这是一个很好的分享规则。谢谢