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, content và excerpt 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
@deferredExportthay 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.updatechỉ có trong schema khi tính năng Nested Mutations được bật