выбор данных из связующей таблицы для 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 шт):
Если отдельная сущность под таблицу сделана то, можно посмотреть в сторону ExpressionBuilder Официальная документация доктрины Разбор подобного запроса на StackOverflow
Если же сущности как таковой заведено не было, то скорее всего DQL не сможет корректно отработать с таким запросом. Я бы в таком случае попробовал RawSQL
Однако, сразу скажу что не призываю так делать, я считаю наиболее правильным для вас путем завести таки недостающую сущность и использовать ExpressionBuilder