Laravel 5.4 LengthAwarePaginator分页结果丢失问题求助
解决Laravel集合手动分页(LengthAwarePaginator)的问题
看起来你正在尝试对筛选后的Laravel商品集合手动分页,但你的manuallyPaginate方法代码好像没写完,我来帮你补全并优化这个实现,确保它能正常工作。
先看下你的业务代码逻辑:
$all_products = $all_products->where('scat_id', $sub_category); $products = $this->manuallyPaginate($all_products);
这里$all_products是Laravel集合实例,经过where筛选后还是集合,接下来我们完善手动分页的方法:
完整的manuallyPaginate方法实现
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Request; private function manuallyPaginate($collection) { // 总记录数(用集合的count方法更准确) $total = $collection->count(); // 每页显示条数 $perPage = 15; // 获取当前页码,默认第1页(用Request门面更贴合Laravel新写法) $currentPage = Request::get('page', 1); // 计算需要跳过的记录数 $offset = ($currentPage - 1) * $perPage; // 对集合切片,拿到当前页的记录,并用values()重新索引避免断层 $currentPageItems = $collection->slice($offset, $perPage)->values(); // 实例化LengthAwarePaginator return new LengthAwarePaginator( $currentPageItems, $total, $perPage, $currentPage, [ 'path' => LengthAwarePaginator::resolveCurrentPath(), // 自动获取当前请求的URL路径 'pageName' => 'page', // 分页参数名,默认就是page ] ); }
几个关键细节提醒
- 记得引入对应的类:
LengthAwarePaginator和Request(或者你习惯用Input也可以,不过Request是更推荐的写法) - 集合调用
slice后一定要加values(),不然返回的子集索引会和原集合一致,前端遍历的时候可能出现索引不连续的问题 resolveCurrentPath()会自动识别当前页面的URL,确保分页链接指向正确的地址
额外优化建议
如果你的$all_products是直接从数据库查询出来的,其实完全可以在查询构建器阶段就完成筛选+分页,这样性能会更好(数据库层面直接分页,不用把所有商品数据都加载到内存):
// 假设你的商品模型是Product $products = Product::where('scat_id', $sub_category)->paginate(15);
这种方式Laravel会自动处理所有分页逻辑,代码更简洁,也更高效。只有当你必须处理已经在内存中的集合(比如经过复杂的内存数据处理后),才需要用到手动分页的方式。
内容的提问来源于stack exchange,提问作者altexo
相关产品推荐
相关产品推荐

