Выберите из таблицы соединений - PullRequest
0 голосов
/ 12 марта 2020

все! Что мне делать, если мне нужно сделать выбор из таблицы соединений?

Например, я разрабатываю проект и мне нужно делать чаты между пользователями. У меня есть две сущности: User и Chat, и отношение многих ко многим между ними (соответственно, у меня есть три таблицы: user, chat, chat_user). Я пытаюсь получить все чаты, пользователь которых является участником, и всех пользователей из этих чатов.

Я сделал следующий запрос SQL:

SELECT *
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 = <idUser>);

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

И я попытался добавить сущность ChatUser и получить данные в ChatRepository smt. как это:

public function getChatsData($idUser)
   {
       $subQuery = $this->getEntityManager()
           ->getRepository(ChatUser::class)
           ->createQueryBuilder('chus')
           ->select('chus.chat')
           ->andWhere('chus.user = :idUser')
           ->setParameter('idUser', $idUser)
       ;

       $qb = $this->createQueryBuilder('c');

       return $qb
           ->innerJoin('c.chatUsers', 'cu')
           ->addSelect('cu')
           ->innerJoin('cu.user', 'u')
           ->addSelect('u')
           ->innerJoin('c.messages', 'm')
           ->addSelect('m')
           ->andWhere('u.id = :idUser')
           ->andWhere($qb->expr()->in(
               'c.id',
               $subQuery->getDQL()
           ))
           ->setParameter('idUser', $idUser)
           ->getQuery()
           ->getResult()
           ;
   }

но это не работает. Я получаю сообщение об ошибке [Semantical Error] line 0, col 12 near 'chat FROM App\Entity\ChatUser': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

Есть ли Doctrine стандартные инструменты для таких задач?

...