2016-12-06 124 views
1

我有兩個相關型號'圍場'&'檢查'。一個院子可以有多個檢查。Laravel通過關係屬性訂購數據

我希望能夠根據檢查屬性'reinspect_at'來訂購Yard列表。我有一個模型方法,根據檢查日期返回院子的最新檢查。

我曾嘗試以下:

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

但這並不訂購基礎上,reinspect_at日期院子,它只是排序每個院子裏的最新檢驗。

我希望能夠始終爲院子返回最新的檢測結果,但需要能夠根據reinspect_at日期對每個院子的最新檢測結果進行重新排序。歡呼聲

屏幕截圖顯示下面的碼錶。正如你所看到的,檢查截止日期是我希望能夠對結果進行排序的方式。

enter image description here

** **更新 看起來像我想要的是可以在前臺使用模板:

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

這將是最好做能夠從控制器這樣做雖然,所以我可以有其他的選項來排序。

+0

我使用數據表插件排序...你能證明你得到 – lewis4u

+0

結果的截圖已經添加了一個屏幕截圖 – Pedro

回答

0

例如:

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

而且

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

嗨,這樣,只有爲每個碼頭訂購檢驗,我想根據最新檢驗的reinspect_at日期來訂購碼頭清單。 即 碼1 - 01-01-2016 碼2 - 02-01-2016 – Pedro

0

你可以使用一些返回集合的方法。一般來說,你想在數據庫端處理這一切,但我認爲這種方式是值得的,因爲它大大簡化了過程。

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

我通過隔離將您的訂單刪除了。不確定如果您還按reinspect_date進行排序,您希望如何處理該問題。

+0

嗨,感謝您的回覆,這似乎沒有對碼錶列表的順序產生影響。 – Pedro

0

貌似我可以做到以下幾點:

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

所以它的工作原理是這樣的? – lewis4u

+0

是的,這行: '$ yards = $ yards-> sortByDesc('latestInspection.reinspect_at');' 根據關聯日期對其進行排序 – Pedro