请查看以下代码。
$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');
}
我不需要在模型中订购,因为我多次使用这种关系,只需在此单一查询中订购。
一个已完成的服务记录关系只有一个帐户。 所以基本上我需要在帐户字段中对已完成的服务记录进行排序。
表
CompletedService
|id| account_id|service_id|service_provider_id|gallons_collected|service_date
|1 | 2 | 1 | 9 | 50 | 2017-08-29
帐户
| id | restaurant_name|
我们将不胜感激。 在此先感谢。
答案 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()
个值。