Laravel 5.2中LengthAwarePaginator的lastPage()始终返回1的问题
解决Laravel 5.2 LengthAwarePaginator中lastPage()始终返回1的问题
嘿,这个问题我之前也踩过坑,根源其实就在你创建分页器时传入的参数上!
问题出在哪?
你现在创建LengthAwarePaginator的时候,第二个参数传的是$collection->count()——但这个时候的$collection已经是经过forPage()筛选后的当前页数据集合了,它的数量只是当前页的条目数,不是整个数据集的总数量。分页器拿到这个数值后,会误以为总共就这么多条数据,自然计算出来的最后一页就是1了。
正确的实现方式
你需要先把完整数据集的总记录数保存下来,再对集合做分页筛选,最后把总记录数传给分页器:
// 1. 构建完整的原始集合 $collection = collect(); foreach ($rows as $row) { $collection->push($row); } // 2. 先获取完整集合的总记录数!这一步绝对不能少 $totalItems = $collection->count(); // 3. 对完整集合排序,再筛选出当前页的数据 $currentPageItems = $collection->sortBy('id')->forPage($page, $page_limit); // 4. 创建分页器,传入总记录数而非当前页的数量 $paginator = new LengthAwarePaginator( $currentPageItems, $totalItems, // 这里用完整集合的总数量 $page_limit, $page, [ // 可选配置:设置分页链接的基础路径,比如当前请求的URL 'path' => \Request::url(), ] ); return $paginator;
额外小提示
如果你的数据是从数据库查询来的,其实可以直接用Laravel自带的查询构造器分页->paginate($page_limit),它会自动帮你处理总记录数、分页逻辑,比手动构建集合再分页要高效得多;但如果确实需要手动处理集合分页,一定要牢记:LengthAwarePaginator的第二个参数必须是整个数据集的总条目数,而不是当前页的条目数。
内容的提问来源于stack exchange,提问作者Yusuf Ibrahim
相关产品推荐
相关产品推荐

