2016-08-20 2 views
1

Voici mon code pour récupérer les messages et les regrouper pour chaque discuterGroupBy après orderBy pour la requête complexe dans Laravel

$query = DB::table('chats'); 

    $otherUserId= $request->input('loadId'); 
    if($otherUserId==0){ 
     $query->join('users as u1', 'u1.id', '=', 'chats.user1_id'); 
     $query->join('users as u2', 'u2.id', '=', 'chats.user2_id'); 
     $query->join('messages', 'messages.chat_id', '=', 'chats.id'); 
     $query->where('chats.user1_id', '=', '{$userId}'); 
     $query->orWhere('chats.user2_id', '=', '{$userId}'); 
     $query->select('messages.chat_id', 'messages.from_id', 'u1.id as user1_id', 'u2.id as user2_id', 'messages.created_at', 'messages.body', 'messages.read', 'u1.name as user1_name', 'u2.name as user2_name', 'u1.picture_url as user1_pic', 'u2.picture_url as user2_pic'); 

     $query->orderBy('messages.created_at ', 'DESC'); 
     $query->groupBy('chat_id'); 
     $messages = $query->paginate(4); 

Quand je lance la requête le résultat est pas attendu OrderBy vient après le groupe par. J'ai beaucoup essayé mais je n'ai pas pu trouver de solution. J'ai également essayé cette solution mais je n'ai pas réussi à la faire fonctionner. Order By before Group By using Eloquent (Laravel)

S'il vous plaît aidez-moi J'ai perdu beaucoup de temps à essayer de le trier. Merci d'avance de m'avoir aidé.

Répondre

0

Une ligne avant le paginate ajoutez le code suivant

dd($query->toSql()); 

Ceci renvoie la chaîne de requête afin de déboguer la requête MySQL. Si vous ne trouvez toujours pas ce qui se passe, collez-le ici pour vous aider.

0

C'est parce que ce n'est pas une syntaxe légale pour placer la clause GROUP BY après un ORDER BY - notez la définition formelle dans les docs. On ne sait pas exactement ce que vous essayez d'accomplir: SQL ne supporte pas particulièrement bien les données ordonnées dans un agrégat.

+0

Merci @Sam Dufel, je ne savais pas que ** Groupe par ** n'est pas légal après ** commande par **. Mais ce que je dois faire est d'obtenir 1 dernier message de chaque discussion (il y a beaucoup de messages liés à un chat), pourriez-vous suggérer une solution pour cela. Merci encore pour votre aide. – Logiclicker

0

Merci à tous pour votre aide. Enfin, je l'ai résolu, j'ai reçu de l'aide de cette réponse d'un autre poste https://stackoverflow.com/a/7745635/6279602 cela fonctionne avec des jointures pas avec le groupe par parce que le groupe par ne supporte pas la commande.