Laravel中实现数据分页最直接有效的方式是使用Eloquent的paginate()方法——它自动处理查询、总数统计、URL参数拼接和分页器渲染,无需手动计算偏移量或总页数。

在 Laravel 中实现数据分页,最直接有效的方式是使用 Eloquent 的 paginate() 方法——它自动处理查询、总数统计、URL 参数拼接和分页器渲染,无需手动计算偏移量或总页数。
用 paginate() 替代 skip()/take()
手写 skip() 和 take() 容易漏掉总数统计,且无法生成标准分页链接。而 paginate() 会执行两条 SQL:一条查数据,一条用 COUNT(*) 查总数,并将当前页码、每页条数、路径等封装进 LengthAwarePaginator 实例。
常见错误:在复杂联查或子查询中直接调用 paginate() 导致 COUNT 失败(如含 GROUP BY 或 SELECT DISTINCT)。
- 简单场景直接链式调用:
App\Models\Post::where('status', 'published')->paginate(15); - 需要自定义每页数量时,传入整数即可,不建议用变量而不校验(如负数或 0 会报错)
- 若需指定页码参数名(默认是
page),加第二个参数:paginate(15, ['*'], 'p'),此时 URL 中用?p=2
在查询构造器(Query Builder)中正确分页
当不用 Eloquent 模型,而是用 DB::table() 时,paginate() 仍可用,但必须确保表有主键字段(否则 COUNT 可能不准);若涉及多表 JOIN,建议显式指定 select() 字段,避免 * 引发的 COUNT 异常。
容易被忽略的点:查询构造器分页默认不带模型实例,返回的是 stdClass 对象数组,不能直接调用模型访问器或关系方法。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
- 基础用法:
DB::table('posts')->where('user_id', 123)->paginate(10); - JOIN 场景下,为兼容 COUNT,可先用
toBase()获取原生查询再分页(较重,慎用) - 如需保持模型行为,优先用 Eloquent 关系或
from()子查询包装
自定义分页视图与链接参数
Laravel 默认渲染 Bootstrap 风格的分页 HTML,但实际项目中常需适配 LayUI、Ant Design 或纯 JSON API。关键不是改模板,而是理解分页器对象暴露的接口。
常见误区:以为修改 resources/views/vendor/pagination 下的文件就能控制所有输出——其实 API 响应根本不会走这个逻辑。
- 获取当前页数据:
$posts->items()(数组),不要直接遍历$posts - 判断是否有下一页:
$posts->hasMorePages(),比检查nextPageUrl()是否为空更可靠 - API 场景下,通常只返回:
return response()->json([ 'data' => $posts->items(), 'meta' => [ 'current_page' => $posts->currentPage(), 'last_page' => $posts->lastPage(), 'per_page' => $posts->perPage(), 'total' => $posts->total(), ] ]);
分页真正的复杂点不在调用方式,而在大数据量下的性能陷阱:当 OFFSET 很大(比如第 10000 页),MySQL 的 ORDER BY ... LIMIT offset, size 会扫描大量无用行。这时 cursor pagination(游标分页)比传统分页更合适,但 Laravel 原生不支持,需自行基于唯一有序字段(如 id 或 created_at)实现。









