Symfony 2 / Doctrine: Как снизить количество запросов, не теряя при этом преимущества ORM?

Я использую 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 , которых я бы хотел избежать. Единственным решением, которое я знаю до сих пор, является сбор всех необходимых данных в repository и назначение его в action вместо обхода внутри шаблона.

Я бы хотел, чтобы это было так, как показано в твип-фрагменте. Существуют ли какие-либо умные варианты кеширования , которые могли бы обнаружить такие случаи, как мои, и оптимизировать запросы автоматически?

Заранее спасибо!

Related of "Symfony 2 / Doctrine: Как снизить количество запросов, не теряя при этом преимущества ORM?"

Как говорили другие, вы должны получить группу Entities внутри вашего репозитория. Вы можете использовать что-то вроде этого:

 //inside the repository public function findAllFetchGroups(){ return $this->createQueryBuilder('a') ->addSelect('gs')->join('a.groups', 'gs') ->getQuery()->getResult(); } 

Существует два способа достижения цели. Вы можете получить = «EAGER» ваши связанные данные (но он всегда загружает, возможно, необязательные данные) или использовать построитель запросов для объединения связанной коллекции, он будет загружен в один запрос. Но помните, чтобы код был чистым – никаких запросов вне репозиториев 🙂