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

时间:2019-07-14 12:16:25

标签: node.js mongodb rest 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()

仅返回帖子。

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

但是我也想在用户Object中获取该用户的所有帖子。

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

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

1 个答案:

答案 0 :(得分:0)

要查询关系数据,您需要使用片段或pyramida fluent API。正如您已经发现的那样,prisma客户端仅返回标量字段,没有关系。您的情况下的帖子是一种关系。

  

每当使用Prisma客户端查询数据库记录时,所有   获取该记录的标量字段。无论是否   查询单个记录或记录列表。

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

对于单个查询(例如获得一个用户),您可以使用prisma fluent API。因此,要获取特定用户的帖子,您可以编写:

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

这仅适用于单个记录,不适用于列表。要检索所有记录的数据,您需要使用片段。例如。要获得与用户数据一起的关系发布数据,您可以编写如下内容:

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

希望能有所帮助。