有些情况下会从接口读取数据,数据较多时会用到分页,Laravel为这种需求提供了很方便的方法。
官方文档里几句略过,并没有详细说明,经过查找资料,发现如下方法可行。
首先use LengthAwarePaginator
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
假设原内容是:
$result = [
'item1',
'item2',
'item3',
'item4',
'item5',
'item6',
];
对于一个列表来说,item一般会是个array,这里忽略。
情况1,已知总数,只有部分数据
由于本人所使用的接口有页码和每页数量的参数,所以每次查询返回的其实就是每一页的内容了,而接口又返回了符合条件的总数count,所以使用如下方式即可:
$perPage = 10;
$count = 100;//假设这里是接口返回的总数
//创建collection
$collection = new Collection($data);
$currentPageResults = $collection->all();
//生成分页
$data = new LengthAwarePaginator($currentPageResults, $count, $perPage);
//设置分页的链接
$data->setPath($request->url());
情况2,未知总数,有全部数据
而如果$data是全部数据呢,比如100条数据全部返回,然后要生成一个每页10条记录的分页,可以这样做:
//获取当前页码
$currentPage = LengthAwarePaginator::resolveCurrentPage();
//从数组创建一个laravel collection
$collection = new Collection($searchResults);
//设置每页数量
$perPage = 10;
//从collection分割数据
$currentPageSearchResults = $collection->slice($currentPage * $perPage, $perPage)->all();
//生成分页
$paginatedSearchResults= new LengthAwarePaginator($currentPageSearchResults, count($collection), $perPage);
//设置分页的链接
$data->setPath($request->url());
区别
其实两者只是相差了一次分割数据。
最后
在视图里依然使用
{!! $data->render() !!}
输出分页组件。
看起来还挺简单的。