Laravel(Lumen) Query Builder添加页面与文章统计数问题求助
在Laravel/Lumen中添加总文章数和总页数到查询响应
嘿,我完全懂你遇到的困扰——直接用->count()只能拿到当前页的记录数,根本不是你想要的全局总文章数对吧?别着急,分两种场景给你实用的解决方案:
一、使用框架自带的分页器(推荐)
Laravel/Lumen的paginate()方法返回的LengthAwarePaginator对象本身就封装了总记录数、总页数这些核心分页数据,你只需要把它们提取出来加到响应里就行:
示例代码:
// 构建你的查询并分页(这里以Post模型为例,每页10条) $posts = \App\Models\Post::where('status', 'published') ->orderBy('created_at', 'desc') ->paginate(10); // 整理响应数据,包含分页核心字段 return response()->json([ 'data' => $posts->items(), // 当前页的文章列表 'total_articles' => $posts->total(), // 总文章数(全局总数) 'total_pages' => $posts->lastPage(), // 自动计算好的总页数 'current_page' => $posts->currentPage(), // 可选:当前页码 'per_page' => $posts->perPage() // 可选:每页展示数量 ]);
为什么count()不行?因为$posts->count()只会返回当前页的记录数,而total()才是查询结果的全局总数量,lastPage()是框架根据总数量和每页数量自动计算好的总页数。
二、手动分页场景(自定义skip/take)
如果因为业务需求你不能用自带的分页器,需要手动用skip()和take()来分页,那就要单独查询总记录数,再计算总页数:
示例代码:
$perPage = request()->get('per_page', 10); // 每页数量,默认10 $currentPage = request()->get('page', 1); // 当前页码,默认1 $offset = ($currentPage - 1) * $perPage; // 计算数据偏移量 // 获取当前页的文章数据 $posts = \App\Models\Post::where('status', 'published') ->orderBy('created_at', 'desc') ->skip($offset) ->take($perPage) ->get(); // 关键:用和上面完全一致的查询条件获取总文章数 $totalArticles = \App\Models\Post::where('status', 'published')->count(); // 计算总页数,记得用ceil()向上取整(避免出现0.5页这种不合理的情况) $totalPages = ceil($totalArticles / $perPage); // 返回整理后的响应 return response()->json([ 'data' => $posts, 'total_articles' => $totalArticles, 'total_pages' => $totalPages ]);
重要提醒:
- 手动分页时,查询总数量的条件必须和获取当前页数据的条件完全一致,不然总数量会出现偏差!
- 如果有复杂的关联查询或多条件筛选,建议把查询条件封装成一个查询作用域(Query Scope),避免重复写相同的条件代码。
内容的提问来源于stack exchange,提问作者Bartosz Rudziński
相关产品推荐
相关产品推荐

