Laravel按关系属性

时间:2016-12-06 20:26:24

标签: mysql laravel laravel-5

我有两个相关型号'Yards'& “检查”。一个院子可以进行多次检查。

我希望能够根据检查属性'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 )

最好能够从控制器执行此操作,因此我可以通过其他选项进行排序。

3 个答案:

答案 0 :(得分:0)

例如:

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

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

答案 1 :(得分:0)

您可以使用返回集合的某些方法。通常你想在数据库端处理这一切,但我认为这样做是值得的,因为它大大简化了过程。

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

我通过隔离删除了您的订购。如果您还要使用reinspect_date进行排序,则不确定如何处理。

答案 2 :(得分:0)

看起来我可以执行以下操作:

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