2016-12-06 8 views
1

Ich habe zwei verwandte Modelle 'Yards' & 'Inspektionen'. Ein Hof kann mehrere Inspektionen haben.Laravel Bestelldaten nach Relation Eigenschaft

Ich möchte die Yard-Liste basierend auf der Inspektionseigenschaft 'reinspect_at' bestellen können. Ich habe eine Model-Methode, die die letzte Inspektion für die Werft basierend auf dem Überprüfungsdatum zurückgibt.

Ich habe versucht, die folgenden:

$yards = Yard::orderBy('quarantined', 'DESC') 
     ->with(['latestInspection' => function($query){ 
      $query->orderBy('reinspect_at', 'asc'); 
     }]) 
     ->get(); 

Aber dies den Hof auf dem reinspect_at Datum basiert nicht bestellen, es wird nur für jeden Hof die neueste Inspektion der Bestellung.

Ich möchte in der Lage sein, immer die neueste Inspektion für den Hof, aber in der Lage, die Yard-Liste basierend auf dem Datum respect_at für die neueste Inspektion für jeden Hof neu anordnen. Prost

Screenshot der Yard-Liste unten angezeigt. Wie Sie sehen können, ist das Inspektionstermin, wie ich das Ergebnis bestellen möchte.

enter image description here

** Update ** Sieht aus wie das, was ich will, ist möglich im Frontend Vorlage:

@foreach($yards->sortBy('latestInspection.reinspect_at') as $yard) 

es bevorzugt sein, wäre in der Lage, dies zu tun, obwohl von der Steuerung zu tun , so kann ich andere Bestelloptionen haben.

+0

i Datatable-Plugin verwenden für die Sortierung ... können Sie einen Screenshot von einem Ergebnis zeigen, dass Sie – lewis4u

+0

erhalten einen Screenshot – Pedro

Antwort

0

Zum Beispiel:

function latestInspection() { 
    return $this->hasOne('App\Yard')->orderBy('reinspect_at', 'asc'); 
} 

Und

$yards = Yard::with('latestInspection')->orderBy('quarantined', 'DESC')->get(); 
+0

Hallo hinzugefügt haben, auf diese Weise nur bestellt die Inspektion für jeden Hof, möchte ich die Yard-Liste auf der Grundlage der Rückblickdatum von der letzten Inspektion bestellen. , d. H. Werft 1 - 01-01-2016 Werft 2 - 02-01-2016 – Pedro

0

Sie einige der Methoden der zurückgegebenen Sammlung nutzen könnten. Im Allgemeinen möchten Sie dies alles auf der Datenbankseite behandeln, aber ich denke, dass dieser Weg es wert ist, weil es den Prozess sehr vereinfacht.

$yards = Yard::with(['inspections'])->get()->sortBy(function($yard) { 
    return $yard->inspections->max('reinspect_at'); 
}); 

Ich entfernte Ihre Bestellung durch Quarantäne. Nicht sicher, wie Sie damit umgehen möchten, wenn Sie auch nach dem reinspect_date sortieren.

+0

Hallo Danke für die Antwort, dies scheint keinen Unterschied zu machen für die Bestellung der Werftenliste. – Pedro

0

Sieht aus wie ich tun kann, folgende:

$yards = Yard::orderBy('quarantined', 'DESC') 
     ->orderBy('archived', 'ASC') 
     ->orderBy('name', 'ASC') 
     ->get(); 
$yards = $yards->sortByDesc('latestInspection.reinspect_at'); 
+0

So funktioniert das ?? – lewis4u

+0

Ja, diese Zeile: '$ yards = $ yards-> sortByDesc ('neustestInspection.reinspect_at');' Sortiert sie basierend auf dem Beziehungsdatum – Pedro

Verwandte Themen