Почему addSelect () в queryBuilder меняет результат моего запроса - PullRequest
0 голосов
/ 26 марта 2020

У меня есть запрос в хранилище сущностей с другой сущностью ManyToMany: Встреча имеет много пользователей

Это мой вопрос:

$userIds = [2];
$qb = $this->createQueryBuilder('m')
    ->leftJoin('m.users', 'mu')
    ->leftJoin('mu.user', 'u')
    ->where('u.id IN (:ids)')
    ->setParameter('id', $userIds);

Это хорошо работает, если у меня встреча с два пользователя и пользователь с id = 2, запрос дает полный результат с двумя пользователями.

Моя проблема в том, что у меня много запросов в БД (84) при отображении информации о пользователях, поэтому я использую addSelect как это:

    $userIds = [2];
    $qb = $this->createQueryBuilder('m')
        ->leftJoin('m.users', 'mu')
        ->addSelect('mu')
        ->leftJoin('mu.user', 'u')
        ->addSelect('u')
        ->where('u.id IN (:ids)')
        ->setParameter('id', $userIds);

Отлично! у меня сейчас только 16 запросов для отображения информации. но мой запрос возвращает только пользователя с id = 2 при моей встрече с двумя пользователями ???

У меня та же проблема, если я оставляю только addSelect ('mu'). Я думаю, что addSelect () не выполняется для пользователей, которые не относятся к моему поиску.

Как получить полные результаты с помощью addSelect (), чтобы уменьшить количество запросов?

Спасибо за помощь

1 Ответ

0 голосов
/ 26 марта 2020

Вы можете добавить еще один leftJoin для фильтрации по встрече, на которой присутствовал пользователь. Это leftJoin не будет частью addSelect, поэтому в исходном addSelect все пользователи будут посещать каждое собрание

. Вы можете изменить запрос на:

$qb = $this->createQueryBuilder('m')
    ->leftJoin('m.users', 'mu')
    ->addSelect('mu')
    ->leftJoin('mu.user', 'u')
    ->addSelect('u')
    ->leftJoin('mu.user', 'u_filter')
    ->where('u_filter.id IN (:ids)')
    ->setParameter('id', $userIds)
;
...