выбор данных из связующей таблицы для many-to-many с помощью Doctrine

Я делаю чат с пользователями, у меня в БД есть many-to-many между сущностью User и сущностью Chat (соответственно таблицы user, chat, chat_user) Я пытаюсь написать запрос с помощью Doctrine, который выбирает все чаты в которых состоит user + всех пользователей из этих чатов.

На чистом SQL составил такой запрос:

FROM chat c
         INNER JOIN chat_user cu ON c.id = cu.chat_id
         INNER JOIN user u ON u.id = cu.user_id
WHERE c.id IN (SELECT chat_id
               FROM chat_user
               WHERE user_id = <userId>)

Мне непонятно как перегнать в доктрину подзапрос SELECT chat_id FROM chat_user WHERE user_id = <userId>, т. е. как выбрать именно из промежуточной таблицы, если я не делал отдельную сущность для нее.

Вот такой код

$this->createQueryBuilder('ch')
            ->innerJoin('ch.users', 'us')
            ->andWhere('us.id = :idUser')
            ->setParameter('idUser', $idUser)
            ->select('ch.id')
            ->getQuery()
            ;

вернет то же самое, что и подзапрос с выбором из chat_user, но этот код в дальнейшем будет преобразован в запрос с join, так что это не подходит. Кроме того, данные необходимо выбирать одним запросом во избежание проблемы n + 1.

И второй вопрос: можно ли каким-то образом в данном случае с помощью Doctrine вообще без подзапроса обойтись?


Ответы (1 шт):

Автор решения: BlackWidow

Если отдельная сущность под таблицу сделана то, можно посмотреть в сторону ExpressionBuilder Официальная документация доктрины Разбор подобного запроса на StackOverflow

Если же сущности как таковой заведено не было, то скорее всего DQL не сможет корректно отработать с таким запросом. Я бы в таком случае попробовал RawSQL

Документация

Однако, сразу скажу что не призываю так делать, я считаю наиболее правильным для вас путем завести таки недостающую сущность и использовать ExpressionBuilder

→ Ссылка