Laravel Orderby在Eloquent里面没有合作关系吗?

时间:2017-08-29 13:42:57

标签: database laravel laravel-5 laravel-eloquent

请查看以下代码。

 $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"中有多条记录。并且在帐户表中有一个父ID id_id。我在帐户上做了。

ASC和DESC已经尝试过了。

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

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

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

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

输出 enter image description here

CompletedService

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

帐户

| id | restaurant_name|

我们将不胜感激。 在此先感谢。

3 个答案:

答案 0 :(得分:1)

您需要使用备用解决方案。首先,您需要获取数据/集合,然后需要按顺序应用。

Laravel提供了一些功能,使用它们可以对您的收藏进行排序。

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');

答案 1 :(得分:0)

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

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

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

$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

答案 2 :(得分:0)

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();

修改:以上是按CompletedService排序每个Account的{​​{1}}记录,但没有完成任何操作。要按restaurant_name的{​​{1}}列对所有CompletedService模型进行排序,您需要Account条款:

restaurant_name

您不再需要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()个值。