У меня есть приложение Symfony2 с Doctrine как ORM. В моем приложении у меня есть два объекта с отношениями "один ко многим". Единым объектом является User
и многие объекты являются Item
. Конфигурация их отношений ниже:
Пользователь:
oneToMany:
items:
targetEntity: App\Bundle\ItemBundle\Entity\Item
fetch: EAGER
mappedBy: user
Пункт:
manyToOne:
user:
targetEntity: App\Bundle\UserBundle\Entity\User
fetch: EAGER
inversedBy: items
joinColumn:
name: user_id
referencedColumnName: id
Проблема в том, что когда я пытаюсь получить список Users
и их Items
, Doctrine создает отдельный запрос для каждого пользователя для извлечения его элементов.
Сам запрос довольно прост:
$entities = $em->getRepository('AppUserBundle:User')->findBy([], [], 30);
Можно ли автоматически получать все связанные элементы для пользователей в одном запросе с помощью Doctrine?
Я использую SF 2.7.6 и доктринные библиотеки с версиями:
doctrine/annotations v1.2.7 Docblock Annotations Parser
doctrine/cache v1.5.1 Caching library offering an ob...
doctrine/collections v1.3.0 Collections Abstraction library
doctrine/common v2.5.1 Common Library for Doctrine pr...
doctrine/dbal v2.5.2 Database Abstraction Layer
doctrine/doctrine-bundle 1.6.0 Symfony DoctrineBundle
doctrine/doctrine-cache-bundle 1.2.1 Symfony Bundle for Doctrine Cache
doctrine/doctrine-migrations-bundle 1.1.1 Symfony DoctrineMigrationsBundle
doctrine/inflector v1.0.1 Common String Manipulations wi...
doctrine/instantiator 1.0.5 A small, lightweight utility t...
doctrine/lexer v1.0.1 Base library for a lexer that ...
doctrine/migrations v1.1.0 Database Schema migrations usi...
doctrine/orm v2.5.1 Object-Relational-Mapper for PHP
Я не думаю, что выбор желаемого результата - отличная идея в любом случае tbh.
Что-то вроде этого должно работать нормально:
$users = $this->getEntityManager()
->createQueryBuilder()->select('u, i') // key is to select both entities
->from('YourBundle:User', 'u')
->join('u.item', 'i')
->getQuery()->getResult();
Вы можете создать метод в репозитории, который выполняет соединения, чтобы избежать дополнительных запросов. Можно заменить метод findBy
собственной реализацией, но я предпочитаю создавать методы, которые являются более описательными.
Хотя примеры в документации Symfony используют DQL, вы можете использовать QueryBuilder
если хотите.