Ders 7: İçeriği toplu olarak uyarlama
Bu eğitim dersi, tek bir GraphQL isteğiyle birden fazla gönderinin başlığını, içeriğini ve özetini güncelleyerek içeriği toplu olarak uyarlar.
Bu GraphQL queries'nin çalışması için, endpoint'e uygulanan Şema Yapılandırması'nın İç İçe Mutations özelliğinin etkinleştirilmiş olması gerekir.
Aşağıdaki GraphQL queries, birden fazla gönderinin verilerini alır, her biri için title, content ve excerpt alanlarında arama ve değiştirme işlemi uygular, bunları mutation için girdi olarak uyarlar ve tüm sonuçları sözlük biçiminde tek bir dinamik değişken olan $postInputs içine aktarır. Biçim şu şekildedir:
{
"${post ID}": {
"title": "${adapted post title}",
"excerpt": "${adapted post excerpt}"
},
// repeat for all other posts ...
}mutation işleminde, bu girişlerin her biri daha sonra _objectProperty aracılığıyla alınır (${post ID} anahtar olarak kullanılarak) ve gönderiyi güncellemek için input olarak iletilir:
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 eklentisi,
_objectPropertyile çağrıldığında JSON nesnesindeki ($adaptedSourceolarak iletilen) her öğeden özellikleri çıkaran ve ardından_echoile bu özelliklerle birlikte karşılık gelen JSON girdisini oluşturan@applyFielddirektifini sağlar - İşlev alanlarına ek olarak, PHP Functions via Schema eklentisi,
@strReplaceMultiplegibi "işlev direktifleri" aracılığıyla da işlevsellik sağlar - Çok Alanlı Direktifler etkinleştirildiğinde,
affectAdditionalFieldsUnderPosargümanı aracılığıyla ek alanların göreli konumlarını belirterek bir direktifi birden fazla alana uygulayabiliriz - Bir direktifi belirli bir alana uygularken ve ardından değerini dışa aktarırken,
@exportyerine@deferredExportkullanmak gerekir - Çok Alanlı Direktifler ile
@export(veya@deferredExport) birlikte kullanıldığında, dışa aktarılan değer tüm alanları içeren bir JSON nesnesidir Post.updatemutation'ı, şemada yalnızca İç İçe Mutations özelliği etkinleştirildiğinde kullanılabilir