ThinkPHP 6.0 使用 paginate() 方法实现分页,支持数据库查询、数组及自定义数据源;默认每页15条,自动获取 $_GET['page'],返回 Bootstrap 分页实例,模板中调用 $list->render() 渲染。

在 ThinkPHP 6.0 中实现分页查询非常简单,核心是使用 paginate() 方法替代传统的 limit() + page() 手动分页逻辑。框架已内置分页器,支持数据库查询、数组分页、自定义数据源等多种场景。
基础数据库分页(最常用)
直接在模型或查询构造器上调用 paginate() 即可自动处理当前页码、每页数量、总记录数和分页 HTML 渲染。
- 默认每页显示 15 条,当前页由
$_GET['page']自动获取(可配置) - 返回的是
think\Paginator\driver\Bootstrap实例(默认使用 Bootstrap 分页样式) - 模板中可直接调用
$list->render()输出分页 HTML
示例代码:
$list = UserModel::where('status', 1)->order('id', 'desc')->paginate(10);{volist name="list" id="user"}<p>{$user.username}</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>{/volist}<br>{$list->render()|raw}自定义分页参数
可通过数组传入更多配置,控制分页行为:
-
list_rows:每页数量(如10) -
page:指定当前页(不填则自动读取page参数) -
query:追加到分页链接的额外参数(如搜索条件) -
type:分页类名,可用于切换样式(如'type' => 'bootstrap'或自定义类)
示例:
$list = UserModel::where('name', 'like', "%{$keyword}%")<br> ->paginate([<br> 'list_rows' => 8,<br> 'page' => input('page/d', 1),<br> 'query' => ['keyword' => $keyword]<br> ])手动传入当前页与总数(适合复杂查询)
当 SQL 使用了 GROUP BY、子查询或 UNION 导致 COUNT(*) 失效时,可先查总数,再查数据,最后用 Collection::paginate() 或 LengthAwarePaginator 手动组装。
更推荐方式是使用 Db::raw() 或闭包查询后,用 think\Paginator\driver\Bootstrap::make() 构造分页器:
$total = Db::table('user')->where(...)->count();<br>$data = Db::table('user')->where(...)->limit($offset, $length)->select();<br>$list = \think\Paginator\driver\Bootstrap::make($data, $total, $listRows, $currentPage, [<br> 'query' => ['status' => $status]<br>]);前端分页样式与链接定制
分页 HTML 默认适配 Bootstrap 4/5,如需修改样式:
- 复制
vendor/topthink/think-paginator/src/paginator/bootstrap4.php到app/common/paginator/MyPage.php,修改模板内容 - 在配置中设置:
'type' => app\common\paginator\MyPage::class - 或直接在模板中遍历
$list->render()的数据:$list->render()返回 HTML,$list->render('default')可换主题
注意:分页链接默认使用 page 参数名,如需改为 p,可在 config/paginate.php 中设置 'var_page' => 'p'。



















