Configurer le schéma
Configurer le schémaUtiliser les mutations imbriquées

Utiliser les mutations imbriquées

Les mutations imbriquées permettent d'effectuer des mutations sur un type autre que le type racine dans GraphQL.

La requête ci-dessous exécute une mutation standard, en utilisant le champ de mutation updatePost depuis le type racine :

mutation {
  updatePost(input: {
    id: 5,
    title: "New title"
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      title
    }
  }
}

La requête ci-dessus peut également être exécutée via une mutation imbriquée, où l'objet post est d'abord interrogé via le champ post, puis le champ de mutation update, qui appartient au type Post, est appliqué sur l'objet post :

mutation {
  post(by: {id: 5}) {
    update(input: {
      title: "New title"
    }) {
      status
      post {
        title
      }
    }
  }
}

Les mutations peuvent également être imbriquées, en modifiant des données sur le résultat d'une autre mutation :

mutation {
  createPost(input: {
    title: "First title"
  }) {
    status
    postID
    post {
      update(input: {
        title: "Second title",
        contentAs: { html: "Some content" }
      }) {
        status
        post {
          title
          content
          addComment(input: {
            commentAs: { html: "My first comment" }
          }) {
            status
            commentID
            comment {
              content
              date
            }
          }
        }
      }
    }
  }
}

Type racine simplifié

Les mutations imbriquées changent le type racine, de QueryRoot et MutationRoot, vers un unique type Root gérant à la fois les requêtes et les mutations :

Mutations imbriquées dans la documentation du schéma

Visualiser les champs de mutation

Utilisez le client Voyager pour visualiser quels sont les champs de mutation.

Avec les mutations imbriquées, chaque type dans le schéma peut contenir à la fois des champs de requête et de mutation. Pour les différencier, la description du champ de mutation est précédée du label "[Mutation] ".

Par exemple, voici les champs pour le type Root :

Description pour le type Root dans la documentation de GraphiQL

Utiliser les mutations imbriquées dans les endpoints

Il existe 2 niveaux auxquels nous pouvons définir si le schéma utilisera les mutations imbriquées ou non. Par ordre de priorité :

1. Dans la configuration du schéma

Faire qu'un custom endpoint ou une persisted query utilise les mutations imbriquées peut être défini via la configuration du schéma correspondante :

Schéma de mutation dans la configuration du schéma

2. Mode par défaut, défini dans les Réglages

Si la configuration du schéma a la valeur "Default", elle utilisera le mode défini dans les Réglages :

Réglages pour les mutations imbriquées
Réglages pour les mutations imbriquées

Configurer les mutations imbriquées

Il existe trois comportements que nous pouvons choisir pour le schéma :

1. Ne pas activer les mutations imbriquées

Cette option désactive les mutations imbriquées (en utilisant le comportement standard à la place) pour le schéma.

2. Activer les mutations imbriquées, en conservant tous les champs de mutation dans la racine

Lorsque les mutations imbriquées sont activées, les champs de mutation peuvent être ajoutés deux fois au schéma :

  • une fois sous le type Root
  • une fois sous le type spécifique

Par exemple :

  • Root.updatePost
  • Post.update

Avec cette option, les champs de mutation « dupliqués » du type racine sont conservés.

3. Activer les mutations imbriquées, en supprimant les champs de mutation redondants de la racine

Même option que ci-dessus, mais en supprimant les champs de mutation « dupliqués » du type racine.

Par exemple :

  • Root.updatePost est supprimé
  • Post.update est disponible

Spécification GraphQL

Cette fonctionnalité ne fait actuellement pas partie de la spécification GraphQL, mais elle a été demandée :