Adonis 5 的分页功能有一个问题,如果你在 model 或者 controller 中使用 hooks 进行查询,再通过 paginate()
方法对数据进行分页处理的话,分页会出现问题,忽略掉 hooks 中查询产生的数据。解决这个问题的方法是在分页时手动传入查询结果而不是调用 paginate()
方法。
以下是一个例子:
const Post = use('App/Models/Post')
class PostController {
async index({ request }) {
const { page, perPage } = request.get()
const query = Post.query()
.where('is_published', true)
.orderBy('created_at', 'desc')
const total = await query.getCount()
const posts = await query
.offset((page - 1) * perPage)
.limit(perPage)
.fetch()
return {
total,
perPage,
page,
data: posts.toJSON()
}
}
}
在上面的示例中,我们手动对数据进行了分页,通过计算 offset 和 limit 对查询结果进行切割。最后返回的数据包含总数、每页数量、页数以及分页后的结果。这样就可以避免 Adonis 5 分页忽略 hooks 中查询产生的数据的问题了。