Paginator — 分页结果封装
Paginator 封装分页查询的结果数据,提供当前页码、总条数、每页条数等元信息的便捷访问。
创建分页
通过 Query::paginate() 自动返回 Paginator 实例:
php
use kernel\Foundation\Database\PDO\DB;
$paginator = DB::table('users')
->where('status', 1)
->orderBy('id', 'DESC')
->paginate([
'page' => 2, // 当前页码
'perPage' => 15, // 每页条数
]);获取分页数据
php
// 当前页数据
$items = $paginator->getItems();
foreach ($items as $user) {
echo $user['name'];
}
// 第一条
$first = $paginator->getFirstItem();
// 最后一条
$last = $paginator->getLastItem();
// 数组格式导出
$data = $paginator->toArray(); // 等同于 getItems()获取分页元信息
php
$paginator->getPage(); // 2 — 当前页码
$paginator->getPerPage(); // 15 — 每页条数
$paginator->getTotal(); // 142 — 总条数
$paginator->getPageSize(); // 15 — 当前页实际数据量手动构造
通常由 Query::paginate() 自动创建,但在特殊场景下也可以手动构造:
php
use kernel\Foundation\Database\PDO\Paginator;
$paginator = new Paginator(
$items, // 当前页数据
$page, // 页码
$perPage, // 每页条数
$total // 总条数
);在 Model 中使用
php
use kernel\Foundation\Database\PDO\Model;
class UserModel extends Model
{
protected $casts = [
'id' => 'int',
'status' => 'int',
];
}
$paginator = UserModel::where('status', 1)
->orderBy('id', 'DESC')
->paginate(['page' => 1, 'perPage' => 20]);
echo "共 {$paginator->getTotal()} 条,当前第 {$paginator->getPage()} 页";
foreach ($paginator->getItems() as $user) {
echo $user->name; // Model 对象,支持 casts 类型转换
}完整分页示例
php
use kernel\Foundation\Database\PDO\DB;
// 获取分页参数
$page = $_GET['page'] ?? 1;
$perPage = $_GET['perPage'] ?? 20;
// 执行分页查询
$paginator = DB::table('articles')
->where('status', 'published')
->where('category_id', $categoryId)
->orderBy('created_at', 'DESC')
->paginate([
'page' => $page,
'perPage' => $perPage,
]);
// 返回分页结果
return [
'items' => $paginator->toArray(),
'page' => $paginator->getPage(),
'perPage' => $paginator->getPerPage(),
'total' => $paginator->getTotal(),
'totalPages' => ceil($paginator->getTotal() / $paginator->getPerPage()),
];