Laravel按关联属性排序订单数据

3
我有两个相关的模型'Yards'和'Inspections'。一个场地可以有多个检查。
我希望能够根据检查属性“reinspect_at”对场地列表进行排序。我有一个模型方法,根据检查日期返回场地的最新检查。
我尝试了以下操作:
$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 )

最好能够从控制器中实现这一点,这样我就可以有其他按顺序排序的选项。


我正在使用datatable插件进行排序...你能展示一下你得到的结果截图吗? - lewis4u
已添加了一张截图。 - Pedro
3个回答

1
看起来我可以做以下事情:
$yards = Yard::orderBy('quarantined', 'DESC')
        ->orderBy('archived', 'ASC')
        ->orderBy('name', 'ASC')
        ->get();
$yards = $yards->sortByDesc('latestInspection.reinspect_at');

是的,这行代码: $yards = $yards->sortByDesc('latestInspection.reinspect_at'); 根据关联日期进行排序。 - Pedro

0

例如:

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

而且

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

嗨,这种方式只是为每个场地订购检查,我想根据最新检查的重新检查日期来订购场地列表。 例如: 场地1 - 2016年01月01日 场地2 - 2016年02月01日 - Pedro

0

您可以使用返回集合的一些方法。通常情况下,您希望在数据库端处理所有内容,但我认为这种方式值得尝试,因为它极大地简化了过程。

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

我已经取消了你的隔离排序。如果你还要按重新检查日期排序,不确定你想如何处理。


谢谢回复。但这好像对码头列表的排序没有影响。 - Pedro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接