如何 paginate 分页后, 根据指定循环组装的 字段 进行排序,且保持分页效果?
$companies = $builder->paginate();
foreach ($companies as $company) {
// 注册人数
$company['register_count'] = User::query()->where('company_id', $company->id)->count();
// 培训人数
$company['train_count'] = CourseLearnRecord::query()->where('company_id', $company->id)
->groupBy('user_id')->get(['user_id'])->count();
// 考核人数
$company['check_count'] = UserExam::query()->where('company_id',
$company->id)->whereNull('spot_check_id')
->groupBy('user_id')->get(['user_id'])->count();
}
现在想 根据 循环组装的register_count 排序, 且保持分页的效果。
paginate() 分页后, $companies->sortByDesc(‘register_count’)->values() , sortByDesc 似乎没有效果, 且分页数据丢失。
这种,用collect函数再排一次本页的顺序
@deatil 首先查询的公司表数据太大,70万数据, 不用paginate()去查询组装数据的话, 会非常的慢, paginate() 后使用 sortByDesc 无效
collect($companies->item())->map()->sortByDesc()
不使用 分页函数 自己写
看的很累,用这个包吧
兄弟,我感觉你这么写,且不说排序的问题,就这循环查询也不太好啊。如果可以的话,还是多存个字段吧。如果不能加字段,一楼二楼的方案应该可以
$builder->withCount(''register)->orderByDesc('register_count')
这样?@hogus2037 他用的不是关联查询,所以用不了withCount()
两个方案:
如果只想给当前页面的数据排序,那可以在获取后排序
否则,应该join起来,然后根据统计出来的数据用order by排序
9楼哥们的方案一的思路是对的,代码的话大致可以参考这一段:
根据上面兄弟的一些建议和方法, 目前是这样来实现的, 但是查询的比较慢
把 register_count 存到表里面去,才行