laravel paginator接口使用分页/自定义分页
在使用laravel开发后端接口时,需要分页。但是paginate()无法传递当前页面值,只能传一个展示条数;
查看paginator
Illuminate\Pagination;
class Paginator extends AbstractPaginator {}
可以看到继承AbstractPaginator
trait MyPage
{
protected function page($data = [],$perPage = 10,$page = 1)
{
$offset = ($page * $perPage) - $perPage;
$res = new LengthAwarePaginator(array_slice($data, $offset, $perPage, true), count($data), $perPage, $page);
$res = $res->toArray();
return [
//使用array_values去掉索引数组key
'data'=>array_values($res['data']),
'total'=>$res['total']
];
}
}
创建一个trait直接使用LengthAwarePaginator
可以传入
$perPage //展示条数
$page //页码
可以看到数据如下
array:2 [
"data" => array:1 [
0 => array:5 [
"id" => 2
"name" => "test"
]
]
"total" => 2
]
此数据就可供前端使用了
在控制器中
class TestController extends Controller
{
use MyPage;
省略....
public function index(Request $request){
...
$data = User::get()->toArray();
$res = $this->page($data,$perPage,$page);
...
}
之后发现这么写挺蠢的,拿到数据再做分页,有问题;
所以更新
use Illuminate\Database\Eloquent\Builder;
//把分页应该放到查询里
public function paginate(Builder $query, $page = 1, $perpage = 10, $load = ''){
$skip = ($page - 1)*$perpage;
$count = $query->count('*');
$totalPage = $count == 0 ? 0 : (int)ceil($count / $perpage);
if($load === ''){
$list = $query->skip($skip)->take($perpage)->get()->toArray();
}else{
$list = $query->skip($skip)->take($perpage)->get()->load($load)->toArray();
}
return [
'data'=>$list,
'total'=>$count,
'totalPage'=>$totalPage,
];
}
控制器里的代码还是差不多
public function list(Request $req){
...
$data = $this->paginate(User::select('*'),$req->page1,$req->perpage);
...
}