当前位置:

首页 > 编程开发 > ThinkPHP5如何实现分页查询_ThinkPHP5实现分页查询方法【代码】

ThinkPHP5如何实现分页查询_ThinkPHP5实现分页查询方法【代码】

ThinkPHP5使用paginate()分页:必须作为查询链最后方法;参数名不匹配需手动指定;数据量大可跳过COUNT防性能瓶颈;通过items()和render()获取数据与HTML,避免误用。

本文目录

    先聊几句分页这事儿。很多人在ThinkPHP5里做分页,第一步就是去查paginate()的用法,照着文档写个例子,跑起来看着也没毛病。但稍微变个场景——比如URL参数名不一样了、表数据上了百万、或者想自己控制一下分页的行为——就开始出各种奇怪的问题。说到底,分页本身不复杂,真正考验人的,是对这个“黑盒”的理解有多深。

    先说最常规的场景。ThinkPHP5里用paginate()做分页,确实是最省事的方式,它自动帮你处理SQL的LIMIT和OFFSET,还能顺手生成分页的HTML代码。但这里有几个容易被忽略的关键点,一旦没注意,报错信息会非常让人摸不着头脑。

    • paginate()必须是查询链上的最后一个方法。别想着在where()之前就调它,也别跟在find()、select()后面再调。严格顺序,否则直接报错。
    • 参数直接传数字,表示每页显示多少条,比如paginate(15)。如果你需要更精细地控制,可以传一个数组,比如paginate(['list_rows'=>20, 'page'=>3])。注意,数组的键名是有规定的,不是随便写。
    • 在调用paginate()之前如果用了field(),记得把主键字段带上(通常是id)。否则,paginate()在统计总数时可能会因为找不到主键而出错。
    // 正确写法:先查状态为1的用户,按创建时间倒序,每页10条
    $users = User::where('status', 1)
        ->order('create_time DESC')
        ->paginate(10);
    
    // 模板中输出分页HTML,默认是Bootstrap风格
    echo $users->render();

    手动传入当前页码时,得搞清楚参数名

    这是另一个高频坑点。ThinkPHP5默认从$_GET['page']里读当前页码,但现实项目里,带翻页的URL往往是/list?page_no=2或者用了路由变成了/list/p/2。如果没做配置,paginate()始终读到的是null,自然永远显示第一页。

    解决办法其实也不复杂,分两种情况:

    • 如果是GET参数名不一样,可以用第三个参数指定:paginate(10, false, ['page' => 'page_no'])。第二个参数false的意思是“不自动获取总记录数”,一般情况下不用动它。
    • 如果用了URL路由(比如list/p/:page),就需要配合input('param.page')手动传页码进去:paginate(10, false, ['page' => input('param.page', 1)])。

    必须警惕的是,不要在控制器里自己先input('page'),然后把取到的值再传给paginate()。这么做等于绕过了TP5自带的页码校验逻辑,如果传入的是负数或者非数字,SQL就会报异常,这是一个非常隐蔽的坑。

    从分页结果对象里取数据,方式和取分页信息要分开

    又有新人会踩的雷:$list = User::paginate(10)之后,直接foreach($list as $u),结果报错Invalid argument supplied for foreach()。原因很简单,$list不是一个数组,它是一个Paginator对象。你得用对方法才能拿到里面的东西。

    • 取当前页的数据:用$list->items(),返回的是一个Collection或数组。
    • 取分页的HTML代码:用$list->render(),返回的是字符串。
    • 取总条数:用$list->total()。千万别写成count($list),那个数的是当前页的数据条数,不是总记录数。
    • 模板里输出分页链接时,常见写法是{$data->render|raw},一定要加上|raw,否则HTML会被转义成纯文本,什么都看不到。

    数据量大的时候,count()是性能瓶颈

    当表里数据到了百万级别,又没有合适的索引时,paginate()默认执行的COUNT(*)可能会耗时好几秒。说到底,这锅真不该让TP5来背,是MySQL本身的查询优化问题。在数据量大到一定程度后,强行优化count()不如换个思路。

    • 直接在paginate()的第二个参数传false来跳过count:paginate(15, false)。这样之后,$list->lastPage()和$list->total()是获取不到值的,但hasMore仍然可用——系统会通过判断是否能查到下一页的数据来确定。
    • 前端显示“共 ? 条”的位置,可以留空,或者直接改成“仅显示前N条”。从用户体验角度看,这种诚实反而更友好。
    • 如果确实需要总数,可以单独维护一个缓存里的近似值,比如用定时任务定期更新,没必要每次请求都去执行一次全表COUNT。

    最后必须说的是,分页这个功能本身确实不复杂。但真正考验人的,是对paginate()这个“黑盒”的理解:它的count行为、参数解析机制、以及与URL参数的耦合关系,全都藏在think\Paginator和think\db\Query的源码里。改配置的时候,顺手去翻一下源码里的注释,很多问题其实都能提前避免。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    酷云eye怎么看地方台收视率?各省卫视数据查询方法
    酷云eye怎么看地方台收视率?各省卫视数据查询方法

    查询地方台收视率需先确认频道被酷云覆盖,官网可查接入状态;App中查省级卫视可用榜单或筛选,地市台需输入全称且覆盖终端数≥5万,才能调取实时曲线与对比分析。

    Windy气象怎么看PM2.5?空气质量指数查询方法
    Windy气象怎么看PM2.5?空气质量指数查询方法

    在WindyApp中,从主界面右下角菜单进入空气质量图层,可快速获取PM2.5浓度与AQI数值。支持定位自动获取或手动搜索城市,还能切换海拔高度观察污染物垂直分布,直观反映近地面污染状况。

    搜狗五笔编码查询方法
    搜狗五笔编码查询方法

    搜狗五笔输入法遇到生僻字时,点击工具条上的工具箱进入词典,输入字词后点击查找,即可显示对应五笔编码。无需切换输入模式,操作简便快捷,适合查询不常用汉字的编码,提升输入效率。

    工伤保险缴纳时长查询方法
    工伤保险缴纳时长查询方法

    在支付宝市民中心进入社保,选择电子社保卡,点击查询服务中的参保缴费记录明细,再选工伤保险,即可查看个人工伤保险的缴纳时长详情,包括缴费起止时间及累计月数。

    工伤保险查询方法指南
    工伤保险查询方法指南

    在支付宝App内,进入市民中心,点击办事大厅,找到工伤保险查询功能,即可查看缴费记录、待遇发放等详细信息。操作简单明了,按步骤指引即可快速完成查询,方便职工随时掌握自身权益。

    京东超市卡有效期查询方法
    京东超市卡有效期查询方法

    想知道京东超市卡还剩多少有效期?操作非常简单,跟着下面几步走就行。 1、 打开京东App,进入首页后,直接点击“京东超市”图标。 2、 进入京东超市主页,往下拉一点,找到并点击下方的“福利”按钮。 3、 进入福利页面后,注意右上角有一个“明细”按钮,点击它。 4、 登录账户明细页面,这里就能清晰看到

    天猫超市卡有效期查询方法
    天猫超市卡有效期查询方法

    很多人都会遇到一个问题:手里攒的天猫超市卡,到底什么时候到期?别担心,其实查询起来很简单。下面就用最直观的图文方式,把整个操作流程拆解清楚,保证你看完就会。 1. 先在手机桌面上找到淘宝图标,点一下,把应用打开。 2. 进入淘宝首页后,找到“天猫超市”的入口,直接点进去。 3. 到了天猫超市界面,注

    山西民生认证app怎么查养老金余额  民生山西养老金余额查询方法
    山西民生认证app怎么查养老金余额 民生山西养老金余额查询方法

    通过“民生山西”App可查询养老金余额:下载登录后进入“社保查询”,找到“养老金查询”可查看待遇调整记录、每月发放记录及年度对账单。注册时需准确填写参保地区,否则数据可能不匹配。

    怎么查看Gmarket物流信息-Gmarket韩国直邮包裹实时查询方法
    怎么查看Gmarket物流信息-Gmarket韩国直邮包裹实时查询方法

    在Gmarket海淘,最让人牵肠挂肚的莫过于包裹的物流状态了。尤其是那些从韩国直邮过来的宝贝,实时掌握它的行踪,心里才踏实。别急,下面就来拆解一下,怎么一步步追踪你的Gmarket韩国直邮包裹。 订单页面查看 当你完成购物并确认订单后,第一个“情报站”就在订单详情页里。通常,页面会有一个“配送信息”

    格子达论文管理系统导师审核怎么看?审核状态查询方法
    格子达论文管理系统导师审核怎么看?审核状态查询方法

    你想在格子达系统里快速确认自己指导的学生论文是否已提交、待你审批,或者已经通过/被退回,又怕漏看某条审批消息导致学生流程卡住——这确实关系到学生能否按时进入答辩环节。登录后第一时间查看待审批项打开浏览器,访问 http://co.gocheck.cn/13924 → 输入工号和初始密码 Hb1234

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。