Schema 教程
Schema 教程第7课:批量调整内容

第7课:批量调整内容

本教程课程演示如何批量调整内容,通过单个 GraphQL 请求更新多篇文章的标题、内容和摘要。

要使此 GraphQL query 正常工作,应用于端点的架构配置需要启用嵌套 Mutation

下方的 GraphQL query 检索多篇文章的数据,对每篇文章的 titlecontentexcerpt 字段执行搜索与替换,将这些内容适配为 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 功能时才在架构中可用