使用嵌套 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 将根类型从 QueryRoot 和 MutationRoot 变更为同时处理 Query 和 mutation 的单一 Root 类型:

可视化 mutation 字段
使用 Voyager 客户端 可视化哪些是 mutation 字段。
使用嵌套 mutation 时,schema 中的每个类型都可以同时包含 Query 字段和 mutation 字段。为了加以区分,mutation 字段的描述前会添加标签 "[Mutation] "。
例如,以下是 Root 类型的字段:

在端点中使用嵌套 mutation
可以在两个级别定义 schema 是否使用嵌套 mutation。按优先级顺序:
1. 在 schema 配置中
可以通过相应的 schema 配置,定义自定义端点或 persisted query 是否使用嵌套 mutation:

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

配置嵌套 mutation
schema 可以选择以下三种行为:
1. 不启用嵌套 mutation
此选项为 schema 禁用嵌套 mutation(改用标准行为)。
2. 启用嵌套 mutation,保留根类型中的所有 mutation 字段
启用嵌套 mutation 后,mutation 字段可能会被添加到 schema 两次:
- 在
Root类型下添加一次 - 在特定类型下添加一次
例如:
Root.updatePostPost.update
使用此选项,根类型中「重复」的 mutation 字段将被保留。
3. 启用嵌套 mutation,移除根类型中的冗余 mutation 字段
与上述选项相同,但移除根类型中「重复」的 mutation 字段。
例如:
Root.updatePost被移除Post.update可用
GraphQL 规范
此功能目前尚未纳入 GraphQL 规范,但已有相关请求: