Skip to content

分页

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

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

基本用法

js
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 属性作为模型每页默认数量。

js
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

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

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

自定义格式

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

js
const { Paginator } = require('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, 因此可以在应用的路由或控制器中直接。你的 express/Koa 应用会自动序列化为 JSON:

js
const app = require('express')();

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

  res.send(users);
});

Released under the MIT License.