如何在使用 Prisma 构建的 REST API 中查询嵌套数据

How to query nested data in a REST API built with Prisma

我正在使用 ExpressPrisma 构建 REST API。我有一个 Prisma 数据模型,如下所示

type User {
  id: ID! @id
  email: String! @unique
  name: String
  posts: [Post!]! @relation(link: INLINE)
}

type Post {
  id: ID! @id
  createdAt: DateTime! @createdAt
  updatedAt: DateTime! @updatedAt
  published: Boolean! @default(value: false)
  title: String!
  content: String
  author: User!
}

现在,如果我这样查询数据

const posts = await prisma.users()

它 returns 我只有帖子。

[
  {
    "id": "cjo5vwaaq6e7p0a42qpoz3aj3",
    "email": "ada@prisma.io",
    "name": "Ada"
  }
]

但我还想获取用户对象中某个用户的所有帖子。

[
    {
      "id": "cjo5vwaaq6e7p0a42qpoz3aj3",
      "email": "ada@prisma.io",
      "name": "Ada", 
      "posts": [
         {
            "title": "This is title"
         }
       ]
    }
]

我该怎么做?我是 Prisma 的新人。我知道我不必使用 Prisma 来构建 REST API 但我必须这样做。 但是我没有找到任何与 REST API 一起使用的 Prisma 的好文档。

要查询关系数据,您需要使用 fragments 或 prisma fluent API。正如您已经发现的,prisma 客户端只有 returns 标量场,没有关系。你的帖子是有关系的。

Whenever a database record is queried using the Prisma client, all scalar fields of that record are fetched. This is true no matter if a single record or a list of records is queried.

参见:https://www.prisma.io/docs/prisma-client/basic-data-access/reading-data-JAVASCRIPT-rsc2

对于单个查询(例如获取单个用户),您可以使用 prisma fluent API。因此,在您的情况下,要让某个用户获得 posts,您可以这样写:

const posts = await prisma.user({ where: { email: 'test@test.de' }})).posts()

参见:https://www.prisma.io/docs/prisma-client/basic-data-access/reading-data-JAVASCRIPT-rsc2/#relations

这仅适用于单个记录,不适用于列表。要检索所有记录的数据,您需要使用片段。例如。要获得关系 post 数据和用户数据,您可以这样写:

const fragment = `
  fragment UserWithPosts on User {
    id
    name
    email
    posts {
      id
      title
    }
  }
`

const userWithPosts = await prisma.users().$fragment(fragment)

参见:https://www.prisma.io/docs/prisma-client/basic-data-access/reading-data-JAVASCRIPT-rsc2/#selecting-fields

希望对您有所帮助。