Я использую 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
вместо обхода внутри шаблона.
Я бы хотел, чтобы это было так, как показано в твип-фрагменте. Существуют ли какие-либо умные варианты кеширования , которые могли бы обнаружить такие случаи, как мои, и оптимизировать запросы автоматически?
Заранее спасибо!
Как говорили другие, вы должны получить группу Entities внутри вашего репозитория. Вы можете использовать что-то вроде этого:
//inside the repository public function findAllFetchGroups(){ return $this->createQueryBuilder('a') ->addSelect('gs')->join('a.groups', 'gs') ->getQuery()->getResult(); }
Существует два способа достижения цели. Вы можете получить = «EAGER» ваши связанные данные (но он всегда загружает, возможно, необязательные данные) или использовать построитель запросов для объединения связанной коллекции, он будет загружен в один запрос. Но помните, чтобы код был чистым – никаких запросов вне репозиториев 🙂