Laravel中如何实现数据分页_Laravel分页功能常用实现方式【详解】

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

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

paginate() 替代 skip()/take()

手写 skip()take() 容易漏掉总数统计,且无法生成标准分页链接。而 paginate() 会执行两条 SQL:一条查数据,一条用 COUNT(*) 查总数,并将当前页码、每页条数、路径等封装进 LengthAwarePaginator 实例。

常见错误:在复杂联查或子查询中直接调用 paginate() 导致 COUNT 失败(如含 GROUP BYSELECT 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 对象数组,不能直接调用模型访问器或关系方法。

  • 基础用法:
    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 原生不支持,需自行基于唯一有序字段(如 idcreated_at)实现。


# mysql  # laravel  # html  # js  # bootstrap  # json  # 大数据  # app  # layui  # sql  # count  # 封装  # select  # 接口  # 访问器  # 对象  # table  # 分页  # 每页  # 自定义  # 链式  # 装进  # 的是  # 直接调用  # 偏移量  # 就能  # 下一页 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速搭建个人网站并优化SEO?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel如何创建自定义Facades?(详细步骤)  如何在万网自助建站平台快速创建网站?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  EditPlus中的正则表达式实战(5)  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何快速搭建虚拟主机网站?新手必看指南  如何快速生成高效建站系统源代码?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  BootStrap整体框架之基础布局组件  python中快速进行多个字符替换的方法小结  想要更高端的建设网站,这些原则一定要坚持!  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何在云主机上快速搭建网站?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel PHP版本要求一览_Laravel各版本环境要求对照  JS弹性运动实现方法分析  微信小程序 wx.uploadFile无法上传解决办法  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何用虚拟主机快速搭建网站?详细步骤解析  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何在建站之星绑定自定义域名?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  米侠浏览器网页背景异常怎么办 米侠显示修复  如何在云虚拟主机上快速搭建个人网站?  C#如何调用原生C++ COM对象详解  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何登录建站主机?访问步骤全解析  如何在阿里云虚拟服务器快速搭建网站?  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  高防服务器:AI智能防御DDoS攻击与数据安全保障  详解jQuery停止动画——stop()方法的使用  做企业网站制作流程,企业网站制作基本流程有哪些?  三星、SK海力士获美批准:可向中国出口芯片制造设备  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何用西部建站助手快速创建专业网站?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口