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
对每个 CompletedService
的 Account
记录进行排序,这没有完成任何事情。要按 Account
的 restaurant_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');
请看下面的代码。
$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
对每个 CompletedService
的 Account
记录进行排序,这没有完成任何事情。要按 Account
的 restaurant_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');