MrF*_*Foh 4 laravel eloquent laravel-4
我试图过滤一个分页的雄辩集合,但每当我使用任何收集方法时,我都会失去分页.
$models = User::orderBy('first_name','asc')->paginate(20);
$models = $models->each(function($model) use ($filters) {
if(!is_null($filters['type'])) {
if($model->type == $filters['type'])
return $model;
}
if(!is_null($filters['state_id'])) {
if($model->profile->state_id == $filters['state_id'])
return $model;
}
if(!is_null($filters['city_id'])) {
if($model->profile->city_id == $filters['city_id'])
return $model;
}
});
return $models;
Run Code Online (Sandbox Code Playgroud)
我正在使用Laravel 4.2,有没有办法坚持分页?
Rob*_*per 11
没有一个答案提供实际问题的答案,这在 Laravel 5.2+ 中是可能的:
如何在不丢失分页器对象的情况下过滤分页器的底层集合
分页器建立在底层集合上,但实际上,当您使用任何继承的Collection方法时,它们返回底层集合而不是完整的分页器对象:集合方法返回用于将集合调用链接在一起的集合。
但是您可以按如下方式弹出、修改和注入集合:
$someFilter = 5;
$collection = $paginator->getCollection();
$filteredCollection = $collection->filter(function($model) use ($someFilter) {
return $model->id == $someFilter;
});
$paginator->setCollection($filteredCollection);
Run Code Online (Sandbox Code Playgroud)
我有一个场景需要对集合进行过滤,我不能依赖查询生成器。
我的解决方案是实例化我自己的Paginator实例:
$records = Model::where(...)->get()->filter(...);
$page = Paginator::resolveCurrentPage() ?: 1;
$perPage = 30;
$records = new LengthAwarePaginator(
$records->forPage($page, $perPage), $records->count(), $perPage, $page, ['path' => Paginator::resolveCurrentPath()]
);
return view('index', compact('records'));
Run Code Online (Sandbox Code Playgroud)
然后在我的刀片模板中:
{{ $records->links() }}
Run Code Online (Sandbox Code Playgroud)
根据您的具体情况扩展mininoz的答案:
//Start with creating your object, which will be used to query the database
$queryUser = User::query();
//Add sorting
$queryUser->orderBy('first_name','asc');
//Add Conditions
if(!is_null($filters['type'])) {
$queryUser->where('type','=',$filters['type']);
}
if(!is_null($filters['state_id'])) {
$queryUser->whereHas('profile',function($q) use ($filters){
return $q->where('state_id','=',$filters['state_id']);
});
}
if(!is_null($filters['city_id'])) {
$queryUser->whereHas('profile',function($q) use ($filters){
return $q->where('city_id','=',$filters['city_id']);
});
}
//Fetch list of results
$result = $queryUser->paginate(20);
Run Code Online (Sandbox Code Playgroud)
通过将适当的条件应用于SQL查询,您将限制返回到PHP脚本的信息量,从而加快进程.
资料来源:http://laravel.com/docs/4.2/eloquent#querying-relations