Lektion 7: Inhalte in Massen anpassen
Diese Tutorial-Lektion passt Inhalte in Massen an und aktualisiert dabei Titel, Inhalt und Auszug mehrerer Beiträge mit einer einzigen GraphQL-Anfrage.
Damit diese GraphQL-Query funktioniert, muss die Schema-Konfiguration, die auf den Endpoint angewendet wird, Nested Mutations aktiviert haben
Die folgende GraphQL-Query ruft die Daten mehrerer Beiträge ab, führt eine Suche und Ersetzung in den Feldern title, content und excerpt für jeden davon durch, passt diese als Eingaben für die Mutation an und exportiert eine einzige dynamische Variable $postInputs mit allen Ergebnissen als Dictionary im Format:
{
"${post ID}": {
"title": "${adapted post title}",
"excerpt": "${adapted post excerpt}"
},
// repeat for all other posts ...
}In der mutation-Operation wird jeder dieser Einträge dann über _objectProperty abgerufen (wobei ${post ID} als Schlüssel verwendet wird) und als input übergeben, um den Beitrag zu aktualisieren:
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
}
}
}
}- Die Erweiterung Field on Field stellt die Direktive
@applyFieldbereit, die mit_objectPropertydie Eigenschaften aus jedem Element des JSON-Objekts (übergeben als$adaptedSource) extrahiert und dann mit_echoden entsprechenden JSON-Input mit diesen Eigenschaften erstellt - Neben Funktionsfeldern bietet die Erweiterung PHP Functions via Schema auch Funktionalität über entsprechende „Funktionsdirektiven", wie z. B.
@strReplaceMultiple - Wenn Multi-Field Directives aktiviert ist, können wir eine Direktive auf mehr als ein Feld anwenden und dabei die relativen Positionen der zusätzlichen Felder über das Argument
affectAdditionalFieldsUnderPosangeben - Wenn du eine Direktive auf ein Feld anwendest und dessen Wert dann exportierst, musst du
@deferredExportstatt@exportverwenden - Wenn du Multi-Field Directives zusammen mit
@export(oder@deferredExport) verwendest, ist der exportierte Wert ein JSON-Objekt, das alle Felder enthält - Die Mutation
Post.updateist im Schema nur verfügbar, wenn die Funktion Nested Mutations aktiviert ist