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":
Je parviens à faire la requête en SQL qui fait ce que je décris en introduction comme ceci:
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;
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....
Merci pour votre aide, je sèche vraiment la...
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() ; }
Partager