Выполнение подзапроса внутри where с помощью Doctrine 2 querybuilder - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь (без успеха) перевести этот SQL запрос в построитель запросов Doctrine2. Как мне сделать, чтобы включить вложенный выбор внутри Где с Querybuilder?

SQL запрос, который я пытаюсь реализовать с помощью querybuilder:

SELECT * FROM `message` A 
WHERE A.id =
(SELECT B.id FROM `message` B 
WHERE (A.user_id = B.user_id AND A.receiver_id = B.receiver_id) OR (A.user_id = B.receiver_id AND A.receiver_id = B.user_id)
ORDER BY creationdate DESC 
LIMIT 1)

До сих пор я пытался что-то подобное в Репозиторий сообщений, но я думаю, что я далек от хорошего способа сделать это:

public function getConversations()
    {
      $qb = $this
        ->createQueryBuilder('A')
        ->Where('A.id IN 
            (SELECT B.id FROM Message B 
            WHERE (A.user_id = B.user_id AND A.receiver_id = B.receiver_id) OR (A.user_id = B.receiver_id AND A.receiver_id = B.user_id)
            ORDER BY creationdate DESC
            LIMIT 1')
      ;

      return $qb
        ->getQuery()
        ->getResult()
      ;
    }
}

Это сообщение об ошибке триггера:

Ошибка: класс «Сообщение» не определен.

РЕДАКТИРОВАТЬ: Для заинтересованных людей, я наконец-то нашел решение. Я сделал запрос следующим образом (если у кого-то есть другое решение, я очень заинтересован):

public function getConversations()
{
    $rawSql = "SELECT * FROM `message` A 
                WHERE A.id =
                (SELECT B.id FROM `message` B 
                WHERE (A.user_id = B.user_id AND A.receiver_id = B.receiver_id) OR (A.user_id = B.receiver_id AND A.receiver_id = B.user_id)
                ORDER BY creationdate DESC 
                LIMIT 1)
                ";

    $stmt = $this->getEntityManager()->getConnection()->prepare($rawSql);
    $stmt->execute([]);

    return $stmt->fetchAll();
}
...