跳到内容
Sutando
Esc
↑↓导航↵打开⌘J预览
本页内容

分页

基于偏移的分页:链式调用 paginate 方法获取当前页的模型,以及总数、总页数与现成的分页链接,方便在接口中直接返回。

Sutando 内置了对基于偏移的分页的支持。 您可以通过链接 paginate 方法对查询结果进行分页。

paginate 方法接受要页码作为第一个参数,将每页行数作为第二个参数。 在内部,我们执行一个额外的查询来计算总行数。

基本用法

const users = await db.table('users')
  .where('vote', '>', 1)
  .paginate(2, 15); // instanceof Paginator

const users = await User.query()
  .where('vote', '>', 1)
  .paginate(2); // instanceof Paginator

const users = await db.table('users')
  .where('vote', '>', 1)
  .forPage(2, 15)
  .get(); // instanceof Array

const users = await User.query()
  .where('vote', '>', 1)
  .forPage(1, 15)
  .get(); // instanceof Collection

users.map(user => {
  //
});

如果没有指定,每页行数默认为 15。如果使用模型,也可以通过设置 perPage 属性作为模型每页默认数量。

class Post extends Model {}
class User extends Model {
  perPage = 20;
}

const posts = await Post.query().paginate();
console.log(posts.perPage()); // 15

const users = await User.query().paginate();
console.log(users.perPage()); // 20

paginate 方法返回一个 Paginator 实例。 它保存分页的元数据,以及获取的行。

可用方法

每个分页器实例通过以下方法提供额外的分页信息:

方法 描述
paginator.count() 获取当前页的数据总数
paginator.currentPage() 获取当前页码
paginator.hasMorePages() 是否有更多的页面可供展示
paginator.items() 获取当前页的数据项
paginator.lastPage() 获取最后一页的页码
paginator.perPage() 获取每一页显示的数量总数
paginator.total() 获取结果集中的数据总数
paginator.firstItem() 获取结果集中第一个数据的编号
paginator.lastItem() 获取结果集中最后一个数据的编号

序列化为对象/JSON

您还可以通过调用 toData 或 toJson 方法将分页器结果序列化为 Object/JSON。 它默认返回「蛇形命名」中的键名。

{
  "total": 45,
  "per_page": 15,
  "current_page": 1,
  "last_page": 3,
  "count": 15,
  "data": [
    {
      // Record...
    },
    {
      // Record...
    }
  ],
}

自定义格式

您可以通过调用 Paginator.setFormatter 来覆盖默认的格式。

import { Paginator } from 'sutando';

Paginator.setFormatter((paginator) => {
  return {
    meta: {
      total: paginator.total(),
      per_page: paginator.perPage(),
      current_page: paginator.currentPage(),
      last_page: paginator.lastPage(),
    },
    data: paginator.items().toData(),
  };
});

分页器在转化为字符串的时候会转成 JSON, 因此可以直接从路由返回。Hono 会自动把它序列化为 JSON:

import { Hono } from 'hono';

const app = new Hono();

app.get('/', async (c) => {
  const users = await User.query().paginate(Number(c.req.query('page')) || 1);

  return c.json(users);
});

这个页面有帮助吗?