Bonjour,

Pour une entité qui contient des messages (id message, id expéditeur, id destinataire, text, date d'envoi), je cherche à faire une requête pour obtenir le dernier message de chaque conversation. Une conversation étant un couple expéditeur/destinataire dans les deux sens (la conversation entre les users 1 et 2 sont les entrées 1/2 ou 2/1 au niveau des champs expéditeur et destinataires).

Voici mon entité " Message":

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Message
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
 
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="messages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $User;
 
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="receivedmessages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $receiver;
 
    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $text;
 
    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $creationdate;
Je parviens à faire la requête en SQL qui fait ce que je décris en introduction comme ceci:

Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
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)

Par contre je butte sur la façon de faire cette requête dans Doctrine au niveau du repository Message. A présent voici ce que j'ai fait mais ça ne fonctionne pas (message d'erreur)et je ne suis même pas certain de m'y prendre correctement....

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   public function getConversations()
    {
      $qb = $this
        ->createQueryBuilder->select('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)')
      ;
 
      return $qb
        ->getQuery()
        ->getResult()
      ;
    }
Merci pour votre aide, je sèche vraiment la...