Configurare lo schema
Configurare lo schemaUtilizzare le mutation annidate

Utilizzare le mutation annidate

Le mutation annidate consentono di eseguire mutation su un tipo diverso dal tipo radice in GraphQL.

La query seguente esegue una mutation standard, utilizzando il campo di mutation updatePost dal tipo radice:

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

La query precedente può essere eseguita anche tramite una mutation annidata, dove l'oggetto post viene prima interrogato tramite il campo post, e poi il campo di mutation update, che appartiene al tipo Post, viene applicato sull'oggetto post:

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

Le mutation possono anche essere annidate, modificando dati sul risultato di un'altra 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
            }
          }
        }
      }
    }
  }
}

Tipo radice semplificato

Le mutation annidate modificano il tipo radice, da QueryRoot e MutationRoot a un unico tipo Root che gestisce sia le query che le mutation:

Mutation annidate nella documentazione dello schema

Visualizzare i campi di mutation

Usa il client Voyager per visualizzare quali sono i campi di mutation.

Con le mutation annidate, ogni tipo nello schema può contenere sia campi di query che campi di mutation. Per differenziarli, la descrizione del campo di mutation è preceduta dall'etichetta "[Mutation] ".

Ad esempio, questi sono i campi per il tipo Root:

Descrizione per il tipo Root nella documentazione di GraphiQL

Utilizzare le mutation annidate negli endpoint

Esistono 2 livelli in cui è possibile definire se lo schema utilizzerà le mutation annidate o meno. In ordine di priorità:

1. Nella configurazione dello schema

Far sì che un custom endpoint o una persisted query utilizzi le mutation annidate può essere definito tramite la corrispondente configurazione dello schema:

Schema di mutation nella configurazione dello schema

2. Modalità predefinita, definita nelle Impostazioni

Se la configurazione dello schema ha il valore "Default", utilizzerà la modalità definita nelle Impostazioni:

Impostazioni per le mutation annidate
Impostazioni per le mutation annidate

Configurare le mutation annidate

Esistono tre comportamenti che è possibile scegliere per lo schema:

1. Non abilitare le mutation annidate

Questa opzione disabilita le mutation annidate (utilizzando invece il comportamento standard) per lo schema.

2. Abilitare le mutation annidate, mantenendo tutti i campi di mutation nella radice

Quando le mutation annidate sono abilitate, i campi di mutation possono essere aggiunti due volte allo schema:

  • una volta sotto il tipo Root
  • una volta sotto il tipo specifico

Ad esempio:

  • Root.updatePost
  • Post.update

Con questa opzione, i campi di mutation «duplicati» del tipo radice vengono mantenuti.

3. Abilitare le mutation annidate, rimuovendo i campi di mutation ridondanti dalla radice

Stessa opzione di cui sopra, ma rimuovendo i campi di mutation «duplicati» dal tipo radice.

Ad esempio:

  • Root.updatePost viene rimosso
  • Post.update è disponibile

Specifica GraphQL

Questa funzionalità non fa attualmente parte della specifica GraphQL, ma è stata richiesta: