#vendor/laravel/framework/src/illuminate/database/eloquent/builder.php:480public 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的构造方法,如下:
假定分页得数组为:
[ { "id": 9, "sys_id": 1, "org_id": 2, "user_id": 8, "papaer_id": 26, }, { "id": 5, "sys_id": 1, "org_id": 2, "user_id": 8, "papaer_id": 26, }, { "id": 1, "sys_id": 1, "org_id": 2, "user_id": 8, "papaer_id": 26, } ]
这里一共3条数据,我们设定每页显示1个,一共3页。 分页调用 use illuminate\pagination\lengthawarepaginator; use illuminate\pagination\paginator; public function show(request $request){ $perpage = 1; //每页显示数量 if ($request->has('page')) { $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($real); $paginator =new lengthawarepaginator($item, $total, $perpage, $current_page, [ 'path' => paginator::resolvecurrentpath(), //注释2 'pagename' => 'page', ]); return response()->json(['result'=>$paginator]) }
上面的代码中的重点是$item,如果不做注释1处理,得出的是所有7条数据。
注释2处就是设定个要分页的url地址。也可以手动通过 $paginator ->setpath(‘路径’) 设置。
页面中的分页连接也是同样的调用方式 {{ $paginator->render() }}
注:返回得数据格式大概如下所示:
"result": { "current_page": 3, "data": [ { "id": 5, "sys_id": 1, "org_id": 2, "user_id": 8, "papaer_id": 26 } ], "from": null, "last_page": 2, "next_page_url": null, "path": "http://www.text.tld/examination/show", "per_page": 2, "prev_page_url": "http://www.text.tld/examination/show?page=2", "to": null, "total": 3 }
以上就是laravel的分页问题实例的详细内容。
