Les 7: Inhoud in bulk aanpassen
Deze tutorielles past inhoud in bulk aan, waarbij de titel, inhoud en samenvatting van meerdere berichten worden bijgewerkt met één GraphQL-verzoek.
Om deze GraphQL-query te laten werken, moet de Schema-configuratie die op het eindpunt is toegepast Geneste Mutaties hebben ingeschakeld
De onderstaande GraphQL-query haalt de gegevens op voor de meerdere berichten, voert een zoek-en-vervang uit op de velden title, content en excerpt voor elk van hen, past deze aan als invoer voor de mutatie, en exporteert één dynamische variabele $postInputs met alle resultaten als woordenboek, in het formaat:
{
"${post ID}": {
"title": "${adapted post title}",
"excerpt": "${adapted post excerpt}"
},
// repeat for all other posts ...
}In de mutation-operatie wordt elk van deze vermeldingen vervolgens opgehaald via _objectProperty (met ${post ID} als sleutel) en doorgegeven als input om het bericht bij te werken:
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
}
}
}
}- De extensie Field on Field biedt de directive
@applyFielddie, aangeroepen met_objectProperty, de eigenschappen uit elk item in het JSON-object (doorgegeven als$adaptedSource) extraheert, en vervolgens met_echode bijbehorende JSON-invoer met die eigenschappen aanmaakt - Naast functievelden biedt de extensie PHP Functions via Schema ook functionaliteit via de bijbehorende "functie-directives", zoals
@strReplaceMultiple - Wanneer Multi-Field Directives is ingeschakeld, kunnen we een directive toepassen op meer dan één veld, waarbij we de relatieve positie(s) van het/de aanvullende veld(en) aangeven via het argument
affectAdditionalFieldsUnderPos - Wanneer we een directive toepassen op een veld en vervolgens de waarde ervan exporteren, moeten we
@deferredExportgebruiken in plaats van@export - Wanneer we Multi-Field Directives samen met
@export(of@deferredExport) gebruiken, is de geëxporteerde waarde een JSON-object met alle velden - Mutatie
Post.updateis alleen beschikbaar in het schema wanneer de functie Geneste Mutaties is ingeschakeld