Requête Laravel : orderBy ne fonctionne pas avec groupBy (en utilisant la table de jointure)
P粉316890884
P粉316890884 2024-03-28 16:08:45
0
1
322

Je développe une fonctionnalité de messagerie de base dans Laravel et souhaite afficher tous les utilisateurs qui ont envoyé un message à l'utilisateur actuellement connecté ainsi que le dernier message reçu. Le problème est que "orderByDesc" ne fonctionne pas correctement, il affiche le premier message au lieu du le dernier.

Voici la requête que j'ai écrite :

$receivedmessages = DB::table('messages')
    ->join('users', 'users.id', '=', 'messages.sender_id')
    ->select('messages.*', 'users.username')
    ->where('receiver_id', Auth::user()->id)
    ->orderByDesc('messages.created_at')
    ->groupBy('receiver_id')
    ->get();

Une idée sur la façon de résoudre ce problème ? Merci

P粉316890884
P粉316890884

répondre à tous(1)
P粉546138344

Supprimez ->where('receiver_id', Auth::user()->id) cette condition pour obtenir des résultats pour chaque utilisateur au lieu de celui avec lequel vous vous êtes connecté

L'astuce pour réaliser ce qui précède est d'obtenir le maximum d'identifiants du tableau et d'utiliser ces identifiants dans la WHERE IN condition

$receivedmessages = DB::table('messages')
    ->join('users', 'users.id', '=', 'messages.sender_id')
    ->select('messages.*', 'users.username')
    ->whereRaw('messages.id IN (SELECT MAX(messages.id) FROM messages GROUP BY receiver_id, sender_id)')
    ->where('receiver_id', Auth::user()->id)
    ->orderByDesc('messages.created_at')
    ->get();
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal