Laravel orderby 里面不工作 Eloquent 哪里有关系?

Laravel Orderby not working inside Eloquent whereHas relationship?

请看下面的代码。

 $serviceNew = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date')
            ->where("service_id", '1')->where('service_provider_id', $service_privider_id)->whereMonth('service_date', $month)->whereYear('service_date', $year)
            ->with('account')
            ->whereHas('account', function($qs) {
                $qs->orderBy('restaurant_name', 'DESC');
            })
            ->get();

我在 "CompletedService" 中有多个记录,并且在帐户 table 中有一个父 ID account_id。我用账户做的。

已经尝试了 ASC 和 DESC。

尝试在 whereHas 中排序,但它不影响任何记录。 下面是模型关系

 public function account() {
    return $this->hasOne('App\Account', 'id', 'account_id');
}

我不需要在模型中使用 orderby,因为我多次使用这个关系,只需要在这个单一查询中使用 orderby。

并且一个完成的服务记录关系只有一个账号。 所以基本上我需要在帐户字段上对已完成的服务记录进行排序。

输出

表格

完成服务

|id| account_id|service_id|service_provider_id|gallons_collected|service_date
|1 | 2         | 1        | 9                 | 50              | 2017-08-29

帐户

| id | restaurant_name|

我们将不胜感激。 提前致谢!

whereHas() 用于根据关系的存在来限制您的结果。

参见:https://laravel.com/docs/5.4/eloquent-relationships#querying-relationship-existence

使用以下代码在关系中添加约束:

$serviceNew = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date')
        ->where("service_id", '1')->where('service_provider_id', $service_privider_id)->whereMonth('service_date', $month)->whereYear('service_date', $year)
        ->with(['account' => function($qs) {
            $qs->orderBy('restaurant_name', 'DESC'); 
        }])->get();

参见:https://laravel.com/docs/5.4/eloquent-relationships#constraining-eager-loads

orderBy()whereHas() 查询中无效;您需要将 orderBy() 逻辑移动到 with() 语句:

$serviceNew = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date')
  ->where("service_id", '1')
  ->where('service_provider_id', $service_privider_id)
  ->whereMonth('service_date', $month)
  ->whereYear('service_date', $year)
  ->with(['account' => function($qs){
    $qs->orderBy('restaurant_name', 'DESC');
  })->has('account')->get();

编辑:以上是按 restaurant_name 对每个 CompletedServiceAccount 记录进行排序,这没有完成任何事情。要按 Accountrestaurant_name 列对所有 CompletedService 模型进行排序,您需要一个 join() 子句:

$newService = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date')
->where('service_id', '1')
->where('service_provider_id', $service_privider_id)
->whereMonth('service_date', $month)
->whereYear('service_date', $year)
->join('accounts', 'accounts.id', '=', 'completed_services.account_id')
->orderBy('accounts.restaurant_name');

您不再需要 with() 子句,但使用 has() 可确保您在没有关系的情况下不会获得 null 值。

您需要为此使用替代解决方案。首先你需要获取你的 data/collection 然后需要申请 order by.

Laravel 提供了一些功能,使用它你可以对你的 collection.

进行排序

https://laravel.com/docs/5.6/collections#method-sortby

使用sortByDesc(降序)。所以这是你的代码:

$serviceNew = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date')
            ->where("service_id", '1')->where('service_provider_id', $service_privider_id)->whereMonth('service_date', $month)->whereYear('service_date', $year)
            ->with('account')
            ->whereHas('account')
            ->get()
            ->sortByDesc('account.restaurant_name');