Schema 教程第7课:批量调整内容
第7课:批量调整内容
本教程课程演示如何批量调整内容,通过单个 GraphQL 请求更新多篇文章的标题、内容和摘要。
要使此 GraphQL query 正常工作,应用于端点的架构配置需要启用嵌套 Mutation。
下方的 GraphQL query 检索多篇文章的数据,对每篇文章的 title、content 和 excerpt 字段执行搜索与替换,将这些内容适配为 mutation 的输入,并将所有结果以字典格式导出为单个动态变量 $postInputs,格式如下:
{
"${post ID}": {
"title": "${adapted post title}",
"excerpt": "${adapted post excerpt}"
},
// repeat for all other posts ...
}在 mutation 操作中,每个条目通过 _objectProperty(以 ${post ID} 为键)获取,并作为 input 传入以更新文章:
query TransformAndExportData(
$limit: Int! = 5,
$offset: Int! = 0,
$replaceFrom: [String!]!
$replaceTo: [String!]!
) {
posts: posts(
pagination: { limit: $limit, offset: $offset }
sort: { by: ID, order: ASC }
) {
rawTitle
rawContent
rawExcerpt
@strReplaceMultiple(
search: $replaceFrom
replaceWith: $replaceTo
affectAdditionalFieldsUnderPos: [1, 2]
)
@deferredExport(
as: "postAdaptedSources"
type: DICTIONARY
affectAdditionalFieldsUnderPos: [1, 2]
)
}
}
query AdaptDataForMutationInput
@depends(on: "TransformAndExportData")
{
postInputs: _echo(value: $postAdaptedSources)
@underEachJSONObjectProperty(
passValueOnwardsAs: "adaptedSource",
affectDirectivesUnderPos: [1, 2, 3, 4]
)
@applyField(
name: "_objectProperty",
arguments: {
object: $adaptedSource,
by: {
key: "rawTitle"
}
},
passOnwardsAs: "adaptedTitle"
)
@applyField(
name: "_objectProperty",
arguments: {
object: $adaptedSource,
by: {
key: "rawExcerpt"
}
},
passOnwardsAs: "adaptedExcerpt"
)
@applyField(
name: "_objectProperty",
arguments: {
object: $adaptedSource,
by: {
key: "rawContent"
}
},
passOnwardsAs: "adaptedContent"
)
@applyField(
name: "_echo",
arguments: {
value: {
title: $adaptedTitle,
excerpt: $adaptedExcerpt,
contentAs: {
html: $adaptedContent
}
}
},
setResultInResponse: true
)
@export(as: "postInputs")
}
mutation UpdatePost(
$limit: Int! = 5,
$offset: Int! = 0
)
@depends(on: "AdaptDataForMutationInput")
{
adaptedPosts: posts(
pagination: { limit: $limit, offset: $offset }
sort: { by: ID, order: ASC }
) {
id
postInput: _objectProperty(
object: $postInputs,
by: { key: $__id }
) @remove
update(input: $__postInput) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
title
content
excerpt
}
}
}
}- Field on Field 扩展提供了指令
@applyField,与_objectProperty配合调用时,可从 JSON 对象(以$adaptedSource传入)的每个条目中提取属性,再通过_echo创建包含这些属性的对应 JSON 输入 - 除函数字段外,PHP Functions via Schema 扩展还通过对应的「函数指令」提供功能,例如
@strReplaceMultiple - 启用 Multi-Field Directives 后,可通过参数
affectAdditionalFieldsUnderPos指定附加字段的相对位置,从而将一个指令应用于多个字段 - 对某个字段应用指令后再导出其值时,必须使用
@deferredExport而非@export - 将 Multi-Field Directives 与
@export(或@deferredExport)一起使用时,导出的值是包含所有字段的 JSON 对象 - Mutation
Post.update仅在启用 Nested Mutations 功能时才在架构中可用
Prev
Next