Tutoriel du schéma
Tutoriel du schémaLeçon 7 : Adapter le contenu en masse

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 @applyField qui, 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.update n'est disponible dans le schéma que lorsque la fonctionnalité Mutations Imbriquées est activée