Hướng dẫn schema
Hướng dẫn schemaBài 7: Điều chỉnh nội dung hàng loạt

Bài 7: Điều chỉnh nội dung hàng loạt

Bài học hướng dẫn này điều chỉnh nội dung hàng loạt, cập nhật tiêu đề, nội dung và trích dẫn cho nhiều bài viết chỉ với một yêu cầu GraphQL duy nhất.

Để GraphQL query này hoạt động, Cấu hình Schema được áp dụng cho endpoint cần bật Nested Mutations

GraphQL query bên dưới truy xuất dữ liệu của nhiều bài viết, thực hiện tìm kiếm và thay thế trên các trường title, contentexcerpt cho từng bài, điều chỉnh chúng thành đầu vào cho mutation, và xuất một biến động duy nhất $postInputs chứa tất cả kết quả dưới dạng dictionary, với định dạng:

{
  "${post ID}": {
    "title": "${adapted post title}",
    "excerpt": "${adapted post excerpt}"
  },
  // repeat for all other posts ...
}

Trong thao tác mutation, mỗi mục trong số này sau đó được truy xuất qua _objectProperty (sử dụng ${post ID} làm khóa) và được truyền làm input để cập nhật bài viết:

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
      }
    }
  }
}
  • Extension Field on Field cung cấp directive @applyField, khi được gọi với _objectProperty, trích xuất các thuộc tính từ từng mục trong đối tượng JSON (được truyền dưới dạng $adaptedSource), sau đó với _echo, tạo đầu vào JSON tương ứng với các thuộc tính đó
  • Ngoài các function fields, extension PHP Functions via Schema cũng cung cấp chức năng thông qua các "function directives" tương ứng, chẳng hạn như @strReplaceMultiple
  • Khi Multi-Field Directives được bật, chúng ta có thể áp dụng một directive cho nhiều hơn một trường, chỉ định vị trí tương đối của các trường bổ sung qua đối số affectAdditionalFieldsUnderPos
  • Khi áp dụng một directive cho một trường và sau đó xuất giá trị của nó, phải dùng @deferredExport thay vì @export
  • Khi sử dụng Multi-Field Directives cùng với @export (hoặc @deferredExport), giá trị được xuất là một đối tượng JSON chứa tất cả các trường
  • Mutation Post.update chỉ có trong schema khi tính năng Nested Mutations được bật