如何使用 Prisma 从子实体数量大于特定值的实体中选择数据?

问题描述 投票:0回答:1

我有一个名为“作者”的实体,它下面可以有很多本书。我想从我的数据库中选择与 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()
方法中时)。

node.js postgresql next.js prisma aggregation
1个回答
0
投票

查看基于光标的分页(文档)。您可以按照建议将代码中的过滤与光标结合起来以启用分页。

简而言之,您将在 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 }
    }
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.