У меня есть приложение 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
Вы можете создать метод в репозитории, который выполняет объединения, чтобы избежать дополнительных запросов. Можно заменить метод findBy
своей собственной реализацией, но я предпочитаю создавать методы, которые более наглядны.
Хотя в примерах документации Symfony используется DQL , вы можете использовать QueryBuilder
если хотите.
Я не думаю, что выбор желаемого результата – отличная идея в любом случае tbh.
Что-то вроде этого должно работать нормально:
$users = $this->getEntityManager() ->createQueryBuilder()->select('u, i') // key is to select both entities ->from('YourBundle:User', 'u') ->join('u.item', 'i') ->getQuery()->getResult();