Search code examples
symfonydoctrine-ormquery-builderdoctrine-query

Doing a subquery inside a where with Doctrine 2 querybuilder


I am trying (without success) to translate this SQL query inside a Doctrine2 querybuilder. How should I do to include the subselect inside a Where with Querybuilder ?

SQL query I am trying to implement with 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)

So far, I tried something like this in Message repository but I guess I am far away from the good way to do it :

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()
      ;
    }
}

This trigger error message:

Error: Class 'Message' is not defined.


Solution

  • For people interested I finally found a solution. I did the query like this (if someone has another solution I am very interested):

    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();
    }