配置 Schema
配置 Schema使用嵌套 mutation

使用嵌套 mutation

嵌套 mutation 允许在 GraphQL 中对根类型以外的类型执行 mutation。

以下 Query 使用根类型的 mutation 字段 updatePost 执行标准 mutation:

mutation {
  updatePost(input: {
    id: 5,
    title: "New title"
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      title
    }
  }
}

上述 Query 也可以通过嵌套 mutation 执行:先通过字段 post 查询 post 对象,再对该 post 对象应用属于 Post 类型的 mutation 字段 update

mutation {
  post(by: {id: 5}) {
    update(input: {
      title: "New title"
    }) {
      status
      post {
        title
      }
    }
  }
}

mutation 也可以嵌套,对另一个 mutation 的结果进行数据修改:

mutation {
  createPost(input: {
    title: "First title"
  }) {
    status
    postID
    post {
      update(input: {
        title: "Second title",
        contentAs: { html: "Some content" }
      }) {
        status
        post {
          title
          content
          addComment(input: {
            commentAs: { html: "My first comment" }
          }) {
            status
            commentID
            comment {
              content
              date
            }
          }
        }
      }
    }
  }
}

简化的根类型

嵌套 mutation 将根类型从 QueryRootMutationRoot 变更为同时处理 Query 和 mutation 的单一 Root 类型:

Schema 文档中的嵌套 mutation

可视化 mutation 字段

使用 Voyager 客户端 可视化哪些是 mutation 字段。

使用嵌套 mutation 时,schema 中的每个类型都可以同时包含 Query 字段和 mutation 字段。为了加以区分,mutation 字段的描述前会添加标签 "[Mutation] "

例如,以下是 Root 类型的字段:

GraphiQL 文档中 Root 类型的描述

在端点中使用嵌套 mutation

可以在两个级别定义 schema 是否使用嵌套 mutation。按优先级顺序:

1. 在 schema 配置中

可以通过相应的 schema 配置,定义自定义端点或 persisted query 是否使用嵌套 mutation:

Schema 配置中的 mutation 方案

2. 在设置中定义的默认模式

如果 schema 配置的值为 "Default",将使用设置中定义的模式:

嵌套 mutation 的设置
嵌套 mutation 的设置

配置嵌套 mutation

schema 可以选择以下三种行为:

1. 不启用嵌套 mutation

此选项为 schema 禁用嵌套 mutation(改用标准行为)。

2. 启用嵌套 mutation,保留根类型中的所有 mutation 字段

启用嵌套 mutation 后,mutation 字段可能会被添加到 schema 两次:

  • Root 类型下添加一次
  • 在特定类型下添加一次

例如:

  • Root.updatePost
  • Post.update

使用此选项,根类型中「重复」的 mutation 字段将被保留。

3. 启用嵌套 mutation,移除根类型中的冗余 mutation 字段

与上述选项相同,但移除根类型中「重复」的 mutation 字段。

例如:

  • Root.updatePost 被移除
  • Post.update 可用

GraphQL 规范

此功能目前尚未纳入 GraphQL 规范,但已有相关请求: