Bonjour,

J'ai suivi le tutoriel sur la création d'un système de messagerie que Grafikart a fait.
Pour aller plus loin je veux récupérer les utilisateurs qui ont une conversation avec l'utilisateur actuellement connecté, c'est à dire les utilisateurs qui ont envoyés un message et les utilisateurs à qui l'utilisateur connecté a envoyer un message. J'ai déjà commencé a faire la requête mais j'arrive pas a avoir le résultats que je souhaite. Voici la requête que je fais.

Ce que je fais

// récupérer les messages où l'utilisateur est dans le from
$messagesSend = Message::select('to_id')
                        ->where('from_id', Auth::user()->id)
                        ->groupBy('to_id')
                        ->get();

 // récupérer les messages où l'utilisateur est dans le to
$messagesReceived =  Message::select('from_id')
                    ->where('to_id', Auth::user()->id)
                    ->groupBy('from_id')
                    ->get();

$merge = array_merge($messagesSend->toArray(), $messagesReceived->toArray());
$users = User::whereIn('id',  $merge )->get();

Ce que je veux

Je veux obtenir la liste des utilisateurs qui ont une conversation avec l'utilisateur connecté mais trié dans l'odre du dernier message envoyé ou reçu. C'est à dire selon le champ created_at présent dans la table messages.

Ce que j'obtiens

J'arrive à obtenir la liste des utilisateurs qui ont une conversation avec l'utilisateur connecté, mais ils ne sont pas triés dans l'ordre du dernier message.

6 réponses


Hola !

$users = User::whereIn('id', $merge )->orderBy('created_at', 'DESC')->get();

Devrait fonctionner !

https://laravel.com/docs/5.7/queries#ordering-grouping-limit-and-offset

Bonne journée.

armen953
Auteur

Bonjour,

Merci d'avoir répondu à ma question.
Mais en faisant de cette manière on trie juste les utilisateurs en fonction du champ created_at alors que moi je veux trier les utilisateurs en fonction des derniers messages envoyés. Par exemple quand tu te connecte la liste des utilisateurs est A, B et C moi je veux que quand j'envoie un message à B ou que qaund B m'envoie un message la liste des utilisateurs changent de manière a avoir B, A et C.

Bonne journée.

Bonjour.

Mais en faisant de cette manière on trie juste les utilisateurs en fonction du champ created_at

Dans le contenu de ton sujet, tu dis justement :

C'est à dire selon le champ created_at présent dans la table messages.

Je ne vois absolument pas la différence entre ce que tu demandes dans ton sujet et la proposition qu'il te donne, puisque le résultat de sa proposition est exactement ce que tu demandes dans ton sujet.

armen953
Auteur

Bonjour,

Il y a deux tables, la table message et la table user qui ont les deux un champ created_at. Moi ce que je veux c'est trier selon le created_at de la table Message pour avoir la situation que j'ai décrite avant un peu comme sur messenger ou autre systeme de chat ou la personne avec qui t'as eu une discussion récemment soit haut de la liste. Pour ce qui est de faire le obrder by sur la requête pour obtenir $messagesSend et $messagesReceived cela ne change rien puisque apres pour récupérer les users vu que je fait whereIn l'ordre n'importe pas.

Dans ce cas là, pour commencer, je ne comprends pas pourquoi dans ta requête pour la table users tu y envoie également le résultat des messages envoyés, puisque si tu ne veux lister que les utilisateurs autres que celui qui est connecté, ça n'a pas de sens de récupérer son identifiant.
Il ne te faudrait donc faire que la requête qui récupére les identifiants des utilisateurs qui lui ont envoyé un message, soit $messagesReceived et à cette requête tu y ajoute l'ordre de retour décroissant pour le champ created_at.
Au passage tes commentaires dans le code sont totalement faux, tu y parle de récupérer des messages, alors que les requêtes correspondantes ne font que récupérer les identifiants des utilisateurs, alors quitte à commenter ton code, autant qu'ils soient un minimum correct.
Ce qui donnerait par exemple :

$usersId = Message::select('from_id')
    ->where('to_id', Auth::user()->id)
    ->groupBy('from_id')
    ->orderBy('created_at', 'DESC')
    ->get();

$users = User::whereIn('id',  $usersId->toarray())->get();
armen953
Auteur

Je prend egalement les id des utilisateurs pour affichier, sinon si j'envoie un message a quelqu'un il ne sera plus en haut de la liste. A la base je veux recuperer les utlisateurs a qui j'ai envoyer un message et ce qui m'ont envoyer un message, un peu comme sur les autres système de messagerie, ou la persoone avec qui t'as eu une discussion en dernier soit en haut de la liste.

J'avais deja tester la rêquete que tu propose mais ce ne marche pas.

Voila ce que je veux faire :