2017-04-07 3 views
1

Auch wenn es mehrere Fragen wie diese gibt, kann ich meine Abfrage nicht erhalten, die Zeile mit dem neuesten Datum mit einer Gruppe nach zurückzugeben.Holen Sie die letzte Zeile mit der Gruppe von und Laravel

Ich habe die folgende Tabelle ..

| message_id | from | to | created_at | status 
---------------------------------------------- 
| 1  | 1 | 2 | 2017-04-06 | 1 
| 2  | 1 | 2 | 2017-04-07 | 0 
| 3  | 3 | 4 | 2017-04-06 | 1 
| 4  | 3 | 4 | 2017-04-07 | 0 
---------------------------------------------- 

und ich versuche die Zeilen mit jeweils neuesten Termin zu bekommen.

| message_id | from | to | created_at | status 
---------------------------------------------- 
| 2  | 1 | 2 | 2017-04-07 | 0 
| 4  | 3 | 4 | 2017-04-07 | 0 

Derzeit gibt diese Abfrage die Zeilen mit dem letzten aktuellen Datum zurück.

$messages = Message::where('to', Auth::id()) 
        ->groupBy('from') 
        ->orderBy('created_at', 'DESC') 
        ->paginate(10); 

Antwort

3

Das Problem ist, dass die Ergebnismenge erste zu orderBy wollen, dann geordnet gruppiert werden. Sie können geschachtelte Auswahl verwenden, um zu erhalten, was Sie wollen.

SQL Query:

SELECT t.* FROM (SELECT * FROM messages ORDER BY created_at DESC) t GROUP BY t.from 

Mit Laravel:

$messages = Message::select(DB::raw('t.*')) 
      ->from(DB::raw('(SELECT * FROM messages ORDER BY created_at DESC) t')) 
      ->groupBy('t.from') 
      ->get(); 

Sie müssen nur Ihre where() Klauseln hinzuzufügen.

-1

Sie könnten auch message_id auch

$messages = Message::where('to', Auth::id()) 
        ->groupBy('from') 
        ->orderBy('created_at', 'DESC') 
        ->orderBy('message_id', 'DESC') 
        ->paginate(10); 
Verwandte Themen