thinkphp 8.0分页通过paginate()方法自动实现,需链式调用查询构造器(如db::name()->where()),不可在select()后调用;返回paginator对象,模板中用{$list->render()}输出html,支持自定义每页数、参数名及简单模式优化。

ThinkPHP 8.0 实现分页查询非常简单,核心是使用 paginate() 方法替代旧版的 page(),它会自动处理当前页码、每页数量、总记录数和分页 HTML 渲染。
一、控制器中调用 paginate() 获取分页数据
在控制器方法里,直接对查询对象调用 paginate() 即可。默认每页显示 15 条,当前页由 $_GET['page'] 自动识别(支持自定义参数名):
- 基础写法:
$list = Db::name('user')->paginate(10); - 指定当前页参数名:
paginate(10, false, ['page' => 'p'])→ URL 用 ?p=2 - 关闭简单分页(启用完整分页器):
paginate(10, true) - 配合 where 查询:
Db::name('article')->where('status', 1)->paginate(8)
二、模板中输出数据和分页HTML
在视图模板(如 index.html)中,遍历数据并调用分页渲染方法:
- 遍历数据:
{volist name="list" id="vo"}{$vo.name}{/volist} - 输出分页按钮:
{$list->render()} - 获取当前页码:
{$list->currentPage()} - 获取总页数:
{$list->lastPage()} - 获取总记录数:
{$list->total()}
三、自定义分页样式或链接
默认分页 HTML 使用 Bootstrap 风格,如需修改,可通过配置或传参调整:
- 全局配置(
config/paginate.php):'type' => 'bootstrap', 'var_page' => 'page' - 临时指定模板:
$list->render('default')或自定义 HTML 模板文件 - 手动构造链接(适合 API 场景):
$list->getUrlRange(1, $list->lastPage())
四、注意要点
避免常见问题,提升稳定性:
-
不要在
paginate()前调用select()或find(),否则会报错 - 分页对象不是数组,不能直接 foreach,需用
toArray()转换(仅当需要纯数组时) - 关联查询分页需用
with()+paginate(),例如:UserModel::with('profile')->paginate(10) - 如果数据库字段含中文或特殊字符,确保模型或查询中正确设置字段映射,不影响 count 统计
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











