Laravelの手動ページングについて
12725 ワード
Laravel手動でページングし、シーンを適用するには、ページングデータに特殊なパラメータを渡す必要があり、laravelがpaginateメソッドを持っていない場合.
初期データは次のとおりです.
$data = array( ['id'=>'1','user_id'=>2,'papaer_id'=>10], ['id'=>'2','user_id'=>2,'papaer_id'=>11], );
[ { "id": "1", "user_id": 2, "papaer_id": 10 }, { "id": "2", "user_id": 2, "papaer_id": 11 } ]
ここには全部で2つのデータがあり、1ページに1つ、全部で2ページ表示するように設定しています.
まずlaravelが持っている方法を見て、私にもたらした効果を見てみましょう.
{ "total": 2, "per_page": 1, "current_page": 1, "last_page": 2, "next_page_url": "http://127.0.0.1:8999/page?page=2", "prev_page_url": null, "from": 1, "to": 1, "data": [ { "id": 1, "user_id": 2, "paper_id": 10 } ]}
このルーティングのURLなど、カスタムパラメータを追加すると、次のような効果が得られます(必要に応じてパラメータを追加します).
{
“path”: "http://127.0.0.1:8999", "total": 2, "per_page": 1, "current_page": 1, "last_page": 2, "next_page_url": "http://127.0.0.1:8999/page?page=2", "prev_page_url": null, "from": 1, "to": 1, "data": [ { "id": 1, "user_id": 2, "paper_id": 10 } ]}
初期データは次のとおりです.
$data = array( ['id'=>'1','user_id'=>2,'papaer_id'=>10], ['id'=>'2','user_id'=>2,'papaer_id'=>11], );
json :
[ { "id": "1", "user_id": 2, "papaer_id": 10 }, { "id": "2", "user_id": 2, "papaer_id": 11 } ]
ここには全部で2つのデータがあり、1ページに1つ、全部で2ページ表示するように設定しています.
まずlaravelが持っている方法を見て、私にもたらした効果を見てみましょう.
{ "total": 2, "per_page": 1, "current_page": 1, "last_page": 2, "next_page_url": "http://127.0.0.1:8999/page?page=2", "prev_page_url": null, "from": 1, "to": 1, "data": [ { "id": 1, "user_id": 2, "paper_id": 10 } ]}
このルーティングのURLなど、カスタムパラメータを追加すると、次のような効果が得られます(必要に応じてパラメータを追加します).
{
“path”: "http://127.0.0.1:8999", "total": 2, "per_page": 1, "current_page": 1, "last_page": 2, "next_page_url": "http://127.0.0.1:8999/page?page=2", "prev_page_url": null, "from": 1, "to": 1, "data": [ { "id": 1, "user_id": 2, "paper_id": 10 } ]}
laravel :
#vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:480
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
$query = $this->toBase();
$total = $query->getCountForPagination();
$this->forPage(
$page = $page ?: Paginator::resolveCurrentPage($pageName),
$perPage = $perPage ?: $this->model->getPerPage()
);
return new LengthAwarePaginator($this->get($columns), $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
]);
}
lengthAwarePaginator
LengthAwarePaginator , :
public function __construct($items, $total, $perPage, $currentPage = null, array $options = [])
{
foreach ($options as $key => $value) {
$this->{$key} = $value;
}
$this->total = $total;
$this->perPage = $perPage;
$this->lastPage = (int) ceil($total / $perPage);
$this->path = $this->path != '/' ? rtrim($this->path, '/') : $this->path;
$this->currentPage = $this->setCurrentPage($currentPage, $this->lastPage);
$this->items = $items instanceof Collection ? $items : Collection::make($items);
}
, :use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\Paginator; public function show(Request $request){
$blogs = DB::table('blog')->where('uid',$uid)->select(); //
$perPage = 1; // if ($request->has('page')) { // , page , 1 $current_page = $request->input('page'); $current_page = $current_page <= 0 ? 1 :$current_page; } else { $current_page = 1; }
$item = array_slice($real, ($current_page-1)*$perPage, $perPage); // 1 $total = count($blogs); // $paginator =new LengthAwarePaginator($item, $total, $perPage, $current_page, [ 'path' => Paginator::resolveCurrentPath(), // 2 'pageName' => 'page', ]);
return response()->json(['result'=>$paginator]) }注释1: array_slice(array,start,length) 从start位置,去获取length参数。结果返回一条数据
注释2:就是设定个要分页的url地址。也可以手动通过 $paginator ->setPath(‘路径’) 设置。
页面中的分页连接也是同样的调用方式 {{ $paginator->render() }}。
注:返回得数据格式大概如下所示:
{
“path”: "http://127.0.0.1:8999",
"total": 2,
"per_page": 1,
"current_page": 1,
"last_page": 2,
"next_page_url": "http://127.0.0.1:8999/page?page=2",
"prev_page_url": null,
"from": 1,
"to": 1,
"data": [
{
"id": 1,
"user_id": 2,
"paper_id": 10
}
]
}
, , 。 , 。