Configurar el esquema
Configurar el esquemaUsar mutaciones anidadas

Usar mutaciones anidadas

Las mutaciones anidadas permiten realizar mutaciones en un tipo distinto al tipo raíz en GraphQL.

La consulta de abajo ejecuta una mutación estándar, utilizando el campo de mutación updatePost desde el tipo raíz:

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

La consulta de arriba también puede ejecutarse mediante una mutación anidada, donde el objeto post se consulta primero mediante el campo post, y luego el campo de mutación update, que pertenece al tipo Post, se aplica sobre el objeto post:

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

Las mutaciones también pueden anidarse, modificando datos sobre el resultado de otra mutación:

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 raíz simplificado

Las mutaciones anidadas cambian el tipo raíz, de QueryRoot y MutationRoot, a un único tipo Root que gestiona tanto consultas como mutaciones:

Mutaciones anidadas en la documentación del esquema

Visualizar los campos de mutación

Utiliza el cliente Voyager para visualizar cuáles son los campos de mutación.

Con mutaciones anidadas, cada tipo en el esquema puede contener tanto campos de consulta como de mutación. Para diferenciarlos, la descripción del campo de mutación va precedida de la etiqueta "[Mutation] ".

Por ejemplo, estos son los campos para el tipo Root:

Descripción para el tipo Root en los docs de GraphiQL

Usar mutaciones anidadas en los endpoints

Hay 2 niveles en los que podemos definir si el esquema utilizará mutaciones anidadas o no. Por orden de prioridad:

1. En la configuración del esquema

Hacer que un custom endpoint o persisted query use mutaciones anidadas, puede definirse mediante la correspondiente configuración del esquema:

Esquema de mutación en la schema configuration

2. Modo por defecto, definido en los Ajustes

Si la configuración del esquema tiene el valor "Default", utilizará el modo definido en los Ajustes:

Ajustes para mutaciones anidadas
Ajustes para mutaciones anidadas

Configurar mutaciones anidadas

Hay tres comportamientos que podemos elegir para el esquema:

1. No habilitar mutaciones anidadas

Esta opción deshabilita las mutaciones anidadas (utilizando el comportamiento estándar en su lugar) para el esquema.

2. Habilitar mutaciones anidadas, manteniendo todos los campos de mutación en la raíz

Cuando las mutaciones anidadas están habilitadas, los campos de mutación pueden añadirse dos veces al esquema:

  • una vez bajo el tipo Root
  • una vez bajo el tipo específico

Por ejemplo:

  • Root.updatePost
  • Post.update

Con esta opción, los campos de mutación "duplicados" del tipo raíz se mantienen.

3. Habilitar mutaciones anidadas, eliminando los campos de mutación redundantes de la raíz

La misma opción que arriba, pero eliminando los campos de mutación "duplicados" del tipo raíz.

Por ejemplo:

  • Root.updatePost se elimina
  • Post.update está disponible

Especificación de GraphQL

Esta funcionalidad no forma parte actualmente de la especificación GraphQL, pero ha sido solicitada: