对 laravel 5.2 中的有限记录使用分页
use pagination for limited records in laravel 5.2
我正在尝试对 12 条记录使用分页方法。我需要 12 个结果,其中前 6 个结果出现在第一页,其余 6 个结果出现在第二页。我在控制器中使用了以下代码,
$collection = User::take(12)->whereHas('roles', function($q) {
$q->where('slug', 'member');
}
)->where('status','1')->OrderBy('last_login','desc');
我使用 take() 获取了 12 条记录,并使用 paginate(6) 在一页中显示 6 个结果,
$collection = $collection->paginate(6);
return View('preferred_matches')->with(array('collection'=>$collection));
在我看来,我给出了这样的链接,
{{ $collection->links() }}
但是 take(12) 不起作用。每页显示 6 个结果,但显示的结果超过 12 个。如何使用有限的记录进行分页。提前致谢。
Laravel不支持限制其默认分页,但如果可以通过以下步骤对分页进行限制:
首先在模型中创建一个静态方法(假设用户模型)
第一步:在用户模型的命名空间后添加这两行
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
第二步:在用户模型中输入下面的方法
public static function customPaginate($items,$perPage)
{
//Get current page form url e.g. &page=6
$currentPage = LengthAwarePaginator::resolveCurrentPage();
//Create a new Laravel collection from the array data
$collection = new Collection($items);
//Define how many items we want to be visible in each page
$perPage = $perPage;
//Slice the collection to get the items to display in current page
$currentPageSearchResults = $collection->slice($currentPage * $perPage, $perPage)->all();
//Create our paginator and pass it to the view
$paginatedSearchResults = new LengthAwarePaginator($currentPageSearchResults, count($collection), $perPage);
return $paginatedSearchResults;
}
第三步:在路由或控制器中输入代码查看结果(假设在routes.php
)
Route::get('/', function(){
$users = DB::table('users')->limit(20)->get();
$paginated_result = App\User::customPaginate($users,3);
//dd($paginated_result);
return view('show')->with('paginated_result',$paginated_result);
});
希望它能奏效。
只是对之前的答案稍作更新,如果集合小于 perPage
参数,则存在一个小错误,项目数组为空,这可以通过替换来解决:
$currentPageSearchResults = $collection->slice($currentPage * $perPage, $perPage)->all();
来自
$currentPageSearchResults = ($items->count() > $perPage) ? $collection->slice($currentPage * $perPage, $perPage)->all() : $collection->all();
在静态函数中。
感谢这个@sabuz! ;)
只是关于之前答案的一个更新,如果您尝试访问 "last page" 的数据,它将带来一个空结果,要解决这个问题,您只需更改这一行:
$currentPage = LengthAwarePaginator::resolveCurrentPage();
对于这两个:
$currentPage = LengthAwarePaginator::resolveCurrentPage();
$currentPage = $currentPage - 1;
我希望它对某人有所帮助...
我正在尝试对 12 条记录使用分页方法。我需要 12 个结果,其中前 6 个结果出现在第一页,其余 6 个结果出现在第二页。我在控制器中使用了以下代码,
$collection = User::take(12)->whereHas('roles', function($q) {
$q->where('slug', 'member');
}
)->where('status','1')->OrderBy('last_login','desc');
我使用 take() 获取了 12 条记录,并使用 paginate(6) 在一页中显示 6 个结果,
$collection = $collection->paginate(6);
return View('preferred_matches')->with(array('collection'=>$collection));
在我看来,我给出了这样的链接,
{{ $collection->links() }}
但是 take(12) 不起作用。每页显示 6 个结果,但显示的结果超过 12 个。如何使用有限的记录进行分页。提前致谢。
Laravel不支持限制其默认分页,但如果可以通过以下步骤对分页进行限制:
首先在模型中创建一个静态方法(假设用户模型)
第一步:在用户模型的命名空间后添加这两行
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
第二步:在用户模型中输入下面的方法
public static function customPaginate($items,$perPage)
{
//Get current page form url e.g. &page=6
$currentPage = LengthAwarePaginator::resolveCurrentPage();
//Create a new Laravel collection from the array data
$collection = new Collection($items);
//Define how many items we want to be visible in each page
$perPage = $perPage;
//Slice the collection to get the items to display in current page
$currentPageSearchResults = $collection->slice($currentPage * $perPage, $perPage)->all();
//Create our paginator and pass it to the view
$paginatedSearchResults = new LengthAwarePaginator($currentPageSearchResults, count($collection), $perPage);
return $paginatedSearchResults;
}
第三步:在路由或控制器中输入代码查看结果(假设在routes.php
)
Route::get('/', function(){
$users = DB::table('users')->limit(20)->get();
$paginated_result = App\User::customPaginate($users,3);
//dd($paginated_result);
return view('show')->with('paginated_result',$paginated_result);
});
希望它能奏效。
只是对之前的答案稍作更新,如果集合小于 perPage
参数,则存在一个小错误,项目数组为空,这可以通过替换来解决:
$currentPageSearchResults = $collection->slice($currentPage * $perPage, $perPage)->all();
来自
$currentPageSearchResults = ($items->count() > $perPage) ? $collection->slice($currentPage * $perPage, $perPage)->all() : $collection->all();
在静态函数中。 感谢这个@sabuz! ;)
只是关于之前答案的一个更新,如果您尝试访问 "last page" 的数据,它将带来一个空结果,要解决这个问题,您只需更改这一行:
$currentPage = LengthAwarePaginator::resolveCurrentPage();
对于这两个:
$currentPage = LengthAwarePaginator::resolveCurrentPage();
$currentPage = $currentPage - 1;
我希望它对某人有所帮助...