You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:47:40