【问题标题】:Laravel order data by relation propertyLaravel 按关系属性排序数据
【发布时间】:2016-12-07 05:55:33
【问题描述】:

我有两个相关的模型“Yards”和“Inspections”。一个院子可以进行多次检查。

我希望能够根据检查属性“reinspect_at”订购 Yard 列表。我有一个模型方法,可以根据检查日期返回院子的最新检查。

我尝试了以下方法:

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

但这并没有根据reinspect_at日期订购船厂,它只是订购每个船厂的最新检查。

我希望能够始终返回堆场的最新检查,但需要能够根据 reinspect_at 日期重新排序堆场列表以获取每个堆场的最新检查。干杯

下面显示的堆场列表屏幕截图。如您所见,检查到期日是我希望能够订购结果的方式。

** 更新 ** 看起来我想要的可以在前端模板中使用:

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

最好能够从控制器中执行此操作,这样我可以有其他选项来订购。

【问题讨论】:

  • 我正在使用数据表插件进行排序...你能显示你得到的结果的屏幕截图
  • 已添加截图

标签: mysql laravel laravel-5


【解决方案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'); 根据关系日期对其进行排序
【解决方案2】:

例如:

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

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

【讨论】:

  • 您好,这种方式只为每个货场下单验货,我想根据最近验货的reinspect_at日期来订验货单。即码 1 - 01-01-2016 码 2 - 02-01-2016
【解决方案3】:

您可以使用返回集合的一些方法。一般来说,您希望在数据库端处理这一切,但我认为这种方式是值得的,因为它大大简化了流程。

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

我已通过隔离删除了您的订单。如果您还按 reinspect_date 排序,不确定您想如何处理。

【讨论】:

  • 您好,感谢您的回复,这似乎对码表的排序没有影响。
猜你喜欢
  • 1970-01-01
  • 2018-01-07
  • 2022-01-22
  • 2021-10-10
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 2020-05-12
相关资源
最近更新 更多