我有一个名为“作者”的实体,它下面可以有很多本书。我想从我的数据库中选择与 5 本书以上相关的所有作者。我在 Next 14 应用程序中使用 Prisma,并且我的 API 调用中也有一些分页逻辑。
我可以使用以下代码片段找到 Prisma 内“作者”下的图书数量:
const books = await prisma.author.findMany({
take: limit,
skip: (page - 1) * limit,
select {
id: true,
name: true,
books: {
select: {
id: true,
bookName: true,
publishedDate: true,
},
},
_count: {
select: { books: true }
}
}
});
但是,我注意到 Prisma 不允许我引用计数,以便我可以在查询中插入条件,这样只会检索拥有超过 5 本书的作者。
我找到了一个关于堆栈溢出的解决方案,建议我应该在返回的结果上使用 JS
filter
方法来过滤掉我想要的数据,但是因为我使用的是分页,所以我会从固定计数中丢失数据我已经检索到的行。
我尝试将别名设置为
_count
,以防可能让我访问该值,但这也不起作用。
我尝试使用
groupBy
代替,但我无法选择内部包含自定义对象的其他字段,例如书籍(当我将字段放在 by()
方法中时)。
查看基于光标的分页(文档)。您可以按照建议将代码中的过滤与光标结合起来以启用分页。
简而言之,您将在 JS 中执行 Prisma 查询并过滤结果。一旦获得所需数量的结果,您将返回结果集。当客户端请求更多结果时,他们将提供最后一个结果的 ID 作为游标值。然后您可以使用它来执行连续查询:
// Client provides the ID
const lastResultId = req.params.lastResultId;
const books = await prisma.author.findMany({
// As suggested by documentation, skip the actual
// record with cursor value
skip: 1,
cursor: {
id: lastResultId
},
select {
// ...
},
_count: {
select: { books: true }
}
}
});