Leçon 7 : Adapter le contenu en masse
Cette leçon du tutoriel adapte le contenu en masse, en mettant à jour le titre, le contenu et l'extrait de plusieurs articles avec une seule requête GraphQL.
Pour que cette requête GraphQL fonctionne, la Configuration du schéma appliquée à l'endpoint doit avoir les Mutations Imbriquées activées
La requête GraphQL ci-dessous récupère les données de plusieurs articles, exécute une recherche et un remplacement sur les champs title, content et excerpt pour chacun d'eux, les adapte comme entrées pour la mutation, et exporte une unique variable dynamique $postInputs avec tous les résultats sous forme de dictionnaire, au format :
{
"${post ID}": {
"title": "${adapted post title}",
"excerpt": "${adapted post excerpt}"
},
// repeat for all other posts ...
}Dans l'opération mutation, chacune de ces entrées est ensuite récupérée via _objectProperty (en utilisant ${post ID} comme clé) et passée comme input pour mettre à jour l'article :
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
}
}
}
}- L'extension Champ sur Champ fournit la directive
@applyFieldqui, invoquée avec_objectProperty, extrait les propriétés de chaque élément de l'objet JSON (passé sous forme de$adaptedSource), puis avec_echo, crée l'entrée JSON correspondante avec ces propriétés - En plus des champs de fonctions, l'extension PHP Functions via Schema fournit également des fonctionnalités via leurs « directives de fonctions » correspondantes, telles que
@strReplaceMultiple - Lorsque les Directives Multi-Champs sont activées, nous pouvons appliquer une directive à plus d'un champ, en indiquant la ou les positions relatives du ou des champs supplémentaires via l'argument
affectAdditionalFieldsUnderPos - Lorsqu'on applique une directive à un champ et qu'on exporte ensuite sa valeur, il faut utiliser
@deferredExportà la place de@export - Lorsqu'on utilise les Directives Multi-Champs avec
@export(ou@deferredExport), la valeur exportée est un objet JSON contenant tous les champs - La mutation
Post.updaten'est disponible dans le schéma que lorsque la fonctionnalité Mutations Imbriquées est activée