2016-08-25 10 views
0

Ich bin ein Forum.Laravel Sortierung letzten Datensatz

In der Hauptseite möchte ich die letzte Antwort für jedes Forum anzeigen.

Die Hierarchie ist dies:

Foren

hasMany ('App \ Topic')

hasManyThrough ('App \ Topic', 'App \ Repley')

Themen

gehört zu ('App \ Forum')

hasMany ('App \ Antworten')

Antworten

belongsTo ('App \ Topic')

Ich habe diese:

$forum->replies()->orderBy('created_at', 'desc')->first() 

Und es funktionierte. Aber ich möchte nach Themen und Antworten sortieren. Wenn ich ein neues Thema nach der letzten Antwort poste, möchte ich diese als letzte Antwort anzeigen.

Update: Ich tat dies, und es funktioniert. Aber gibt es einen anderen Weg?

public function last() { 
    $topic = $this->topics->sortByDesc('created_at')->first(); 
    $post = $this->replies->sortByDesc('created_at')->first(); 

    return ($topic->created_at > $post->created_at) ? $topic : $post; 
} 
+0

Was sind die Beziehungen für das Forum, Themen und Antworten? –

+0

erhalten letzte Wiederholung, erhalten letzte Thema, überprüfen, wer neuer ist –

+0

die einfache, beredte Art und Weise https://softonsofa.com/tweaking-eloquen-relations-how-to-get-lates-related-model/ –

Antwort

0

Sie sollten Beziehungen zwischen all diesen Modellen haben. Als können Sie einfach:

$forum->topics->replies->sortByDesc('created_at')->first(); 

Lesen Sie mehr über die verfügbaren Methoden für Sammlungen: https://www.laravel.com/docs/5.2/collections#available-methods

+0

Ich denke, dass er das will: Er hat Antworten und Thema, und er möchte den, der neuer ist, zeigen, wenn es ein Thema neuer als Replay zeigt das Thema, und wenn es ein Replay neuer als alle anderen Themen gibt Zeige die Wiederholung –

+0

Ich denke, das neue Thema am Anfang sollte 1 Beitrag haben (Hauptbeitrag, was ich vermute, ist in der Antworttabelle gespeichert). Wenn nicht, und deine Version korrekt ist, dann muss er meinen obigen Code verwenden, und ähnlich, um das neueste Thema zu erhalten und sich dann selbst zu vergleichen. – Mishek

+0

@AmirBar Ja genau das, was ich will. – yehuda4e

0

Sie können dies versuchen:

$forum->replies()->orderBy('id','DESC')->get(); 
0

Eine Lösung, die ich vorschlagen würde, ist es, die antwortete touch die Themen haben . https://laravel.com/docs/5.3/eloquent-relationships#touching-parent-timestamps

So können Sie immer nach der updated_at des Themas bestellen, denn wenn eine Antwort erstellt/bearbeitet wird, wird auch das Thema aktualisiert.

Um dies zu erreichen, würden Sie nur hinzufügen müssen:

protected $touches = ['topic']; 

oben Das wird unter der Annahme, dass der Methodenname für die Themen Beziehung im Modell Antworten topic() ist.

Hoffe, das hilft!

0

Sie müssen orignal Tabellenname an Stellen von Themen und Antworten in OrderBy-Klausel schreiben.

$forum->topics->replies()->orderBy('topics.updated_at','DESC')->orderBy('repliese.updated_at','DESC')->first(); 
+0

Nicht definierte Eigenschaft: Illuminate \ Database \ Eloquent \ Collection :: $ Antworten Fehler .. – yehuda4e

+0

@ yehuda4e haben Sie Zeitstempel in der Antworttabelle? –

+0

@ yehuda4e Ich habe die Antwort bearbeitet, nur versuchen und sehen, und wenn Sie wieder Fehler bekommen, als ein Snapshot dieses Fehlers anhängen lassen Sie mich sehen, welchen Fehler es gibt –

0
$latestReplay = Replay::orderBy('created_at','desc')->first(); 
$lastTopic = Topic::orderBy('created_at','desc')->first(); 

    if ($latestReplay->created_at->gt($lastTopic->created_at)) { 
      echo $lastReplay->title." is the newer!!"; 
    } else { 
      echo $lastTopic->title." is the newer!"; 
    } 
Verwandte Themen