Pelajaran 7: Mengadaptasi konten secara massal
Pelajaran tutorial ini mengadaptasi konten secara massal, memperbarui judul, konten, dan kutipan untuk beberapa postingan dengan satu permintaan GraphQL.
Agar query GraphQL ini berfungsi, Konfigurasi Skema yang diterapkan pada endpoint perlu mengaktifkan Nested Mutations
Query GraphQL di bawah ini mengambil data untuk beberapa postingan, menjalankan pencarian dan penggantian pada kolom title, content, dan excerpt untuk masing-masingnya, mengadaptasinya sebagai input untuk mutasi, dan mengekspor satu variabel dinamis $postInputs dengan semua hasil sebagai kamus, dengan format:
{
"${post ID}": {
"title": "${adapted post title}",
"excerpt": "${adapted post excerpt}"
},
// repeat for all other posts ...
}Dalam operasi mutation, setiap entri ini kemudian diambil melalui _objectProperty (menggunakan ${post ID} sebagai kunci) dan diteruskan sebagai input untuk memperbarui postingan:
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
}
}
}
}- Ekstensi Field on Field menyediakan direktif
@applyFieldyang, saat dipanggil dengan_objectProperty, mengekstrak properti dari setiap item dalam objek JSON (yang diteruskan sebagai$adaptedSource), dan kemudian dengan_echo, membuat input JSON yang sesuai dengan properti-properti tersebut - Selain kolom fungsi, ekstensi PHP Functions via Schema juga menyediakan fungsionalitas melalui "direktif fungsi" yang bersesuaian, seperti
@strReplaceMultiple - Ketika Multi-Field Directives diaktifkan, kita dapat menerapkan direktif ke lebih dari satu kolom, dengan menunjukkan posisi relatif dari kolom-kolom tambahan melalui argumen
affectAdditionalFieldsUnderPos - Saat menerapkan direktif ke suatu kolom lalu mengekspor nilainya, kita harus menggunakan
@deferredExportalih-alih@export - Saat menggunakan Multi-Field Directives bersama dengan
@export(atau@deferredExport), nilai yang diekspor adalah objek JSON yang berisi semua kolom - Mutasi
Post.updatetersedia dalam skema hanya ketika fitur Nested Mutations diaktifkan