2016-12-06 130 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