Доктрина делает много запросов для отношения один ко многим

1

У меня есть приложение 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
  • 0
    Убедитесь, что вы очистили свой кеш и что отображаемый файл является фактически используемым. Сделай так, чтобы ты не смешивал ямл и аннотации. То, что вы опубликовали, должно работать.
  • 0
    Я только что проверил все это и до сих пор не повезло.
Показать ещё 1 комментарий
Теги:
doctrine
doctrine2
doctrine-orm

2 ответа

1

Я не думаю, что выбор желаемого результата - отличная идея в любом случае tbh.

Что-то вроде этого должно работать нормально:

$users = $this->getEntityManager()
    ->createQueryBuilder()->select('u, i') // key is to select both entities  
    ->from('YourBundle:User', 'u')
    ->join('u.item', 'i')
    ->getQuery()->getResult();
  • 1
    Мне удалось получить связанные записи, используя ваш ответ. Это работает, технически, но дает большие накладные расходы на данные. Допустим, у меня есть несколько отношений «один ко многим» с сущностью «Пользователь», и я хочу вернуть 10000 записей одновременно, и у каждого пользователя есть 10 элементов и 10 учетных записей. Если я буду использовать метод JOIN для этого, он вернет 10000 * 10 * 10 записей. Я бы предпочел, чтобы Doctrine мог сделать 3 отдельных запроса для получения этих данных.
1

Вы можете создать метод в репозитории, который выполняет соединения, чтобы избежать дополнительных запросов. Можно заменить метод findBy собственной реализацией, но я предпочитаю создавать методы, которые являются более описательными.

Хотя примеры в документации Symfony используют DQL, вы можете использовать QueryBuilder если хотите.

  • 1
    Я использую конструктор запросов, запрос в этом вопросе используется только для упрощения, результаты совпадают.
  • 0
    Если вы используете построитель запросов, то опубликуйте запрос. Вам нужно будет выбрать как пользователя, так и предметы. Делает большую разницу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню