thinkphp5分页必须最后调用paginate(),不可在select()后调用,否则报错;模板中须用{$list->render()}输出html,不能直接echo变量;field()需保留主键以防count出错。

ThinkPHP5实现分页组件必须让查询构造器最后一步调用paginate()方法,不能在select()之后补调用,否则会触发Call to undefined method think\Collection::paginate()错误;分页对象需在模板中用render()输出HTML,直接echo变量只显示对象地址。
控制器里正确调用paginate()
使用模型查询时,写成User::where('status', 1)->paginate(10),其中10是每页条数,不是总页数。
使用Db类查询时,写成Db::name('user')->where('status', 1)->paginate(15)。
【不可逆操作】一旦执行了select(),返回的是think\Collection对象,它没有paginate()方法——此时再链式调用paginate()必然报错。
若需自定义当前页参数名(比如把page改成p),必须传入配置数组:->paginate(10, false, ['var_page' => 'p'])。
模板中安全渲染分页HTML
在模板里必须写{$list->render()},不能写{$list}或{$list->items}——前者输出空或对象地址,后者只输出当前页数据数组,不包含页码链接。
如果项目没引入Bootstrap,而默认渲染模板依赖Bootstrap类,页面会出现样式错乱。这时要复制vendor/topthink/think-orm/src/paginator/driver/bootstrap4.php到template/paginate/layui.php,再在配置中设置'type' => 'layui'。
自定义模板时,所有从URL读取的参数(如query中的关键词)必须用htmlspecialchars()包裹,否则存在XSS风险。
带搜索条件的分页(保留GET参数)
第一步:在控制器中获取搜索关键词,例如$keyword = input('keyword/s', '');
第二步:将关键词加入where条件,同时通过query参数透传到分页链接:
→ $list = Db::name('article')->where('title', 'like', "%{$keyword}%")->paginate(12, false, ['query' => ['keyword' => $keyword]]);
第三步:assign给模板后,在模板中仍用{$list->render()}输出——此时所有页码链接自动带上?keyword=xxx。
注意:query参数必须是关联数组,不能传字符串,否则会被忽略。
避免COUNT出错的关键细节
如果查询中用了field()方法,必须确保字段列表里包含主键,例如field('id,title,create_time');
若省略主键,分页底层的COUNT(*)查询可能因缺少主键导致GROUP BY失效或结果不准。
更稳妥的做法是不显式调用field(),让ThinkPHP自动处理字段选择。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











