Passer d'une query SQL à une query doctrine
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:
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:
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:
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...