记录关于一次模型分页数据集重构的问题
问题产生的背景
公司前端在通过获取一次分页查询的接口并渲染数据的时候出现了错误,其错误产生的原因是因为分页对象中的数据集的下标不是从零开始的自然数顺序排序,而是中间出现了部分下标丢失,最终导致前端渲染报错。通常我们通过模型分页查询出来的数据集,其内部元素的下标都是从零开始的自然数,类似下面这样:
$pageinate = Model::where()->paginate(15);
// 获取分页数据集中的数据项
$items = $pageinate->items();
// items 原本的数据项应该是下面这样的
[0 => {}, 1 =>{}, 2 =>{}]
// 实际接口返回的数据项
[0 => {}, 1 => {}, 8 => {}]
为什么会出现上述问题了,是因为我们查询的数据中,有些是不能显示在页面上的,然后又没有办法通过sql的条件进行过滤,最终我们是采用了下面的过滤方式:
$pageinates = Model::where()->paginate(15);
foreach ($pageinates as $key => $item ) {
if($item需要过滤){
unset($pageinates[$key]);
}
}
通过上述伪代码我们得知,我们的数据项数组中的部分数据被unset掉了,于是乎就出现了下标自然数中间丢失的问题。
解决方案
想到了两种解决上述问题的方案,第一种就是前端去改下一下渲染的程序,改成不依赖下标自然数顺序的处理即可。还有一种就是后端分页对象重置一下分页对象的数据集下标,考虑到当时前端比较忙,我们选择了第二种方案。
但是laravel官方文档里面没有给出重置分页对象数据集的方法,这个大家可以去文档里面去看一下,laravel分页文档,这一下就头大了,最终我通过查看laravel源代码,发现其构建了一个下面的方法:
通过阅读源码得知,我们可以用抽象类AbstractPaginator中的setCollection方法来重新设置分页对象的数据集,具体伪代码参考如下:
$pageinates = Model::where()->paginate(15);
foreach ($pageinates as $key => $item ) {
if($item需要过滤){
unset($pageinates[$key]);
}
}
// 其中集合中的values方法就会重置下标的顺序排序
$pageinates->setCollection(collect($pageinates->items())->values());
本作品采用《CC 协议》,转载必须注明作者和本文链接
你这种逻辑就不符合分页,万一所有的搜unset了,你分页了个寂寞?分页总数量都不对,分页数据也不对