Configurar el esquema
Configurar el esquemaUsar directivas multi-campo

Usar directivas multi-campo

Una directiva multi-campo es una directiva que puede aplicarse a múltiples campos, en lugar de a uno solo. Cuando está habilitada, se añade un argumento affectAdditionalFieldsUnderPos a todas las directivas, donde se pueden especificar las posiciones relativas de campos adicionales a los que aplicar la directiva.

Por ejemplo, en la siguiente consulta, la directiva @strTranslate se aplica solo al campo content:

{
  posts {
    excerpt
    content @strTranslate
  }
}

Al campo excerpt también puede aplicársele la directiva @strTranslate, añadiendo el argumento de directiva affectAdditionalFieldsUnderPos con valor [1] (ya que 1 es la posición relativa del campo excerpt desde la directiva @strTranslate):

{
  posts {
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

El número de campos a añadir no está limitado. En esta consulta, dateStr también se está traduciendo:

{
  posts {
    dateStr
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1, 2]
      )
  }
}

El campo sobre el que se aplica naturalmente la directiva (como content en todas las consultas anteriores) no debe especificarse en el argumento.

En la consulta de arriba, las posiciones relativas desde la directiva @strTranslate hasta los campos previos son:

  • Posición 2: dateStr
  • Posición 1: excerpt
  • Posición 0: content <= es implícito, siempre aplicado

Casos de uso

Hay dos casos de uso principales para esta característica:

  1. Rendimiento
  2. Funcionalidad ampliada

Rendimiento

Para directivas que ejecutan llamadas a APIs externas, cuanto menor sea el número de peticiones que ejecutan, más rápido se resolverán.

Ese es el caso con la directiva @strTranslate, que se conecta a la API de Google Translate. Normalmente, para traducir los campos content y excerpt de una lista de entradas, la consulta sería esta:

query {
  posts {
    excerpt @strTranslate
    content @strTranslate
  }
}

Añadiendo @strTranslate dos veces, esta consulta ejecuta dos peticiones a la API de Google Translate (una para traducir todos los valores de excerpt, otra para todos los valores de content).

Gracias a la característica Multi-Field Directives, la consulta de abajo también traduce todos los valores tanto para los campos content como excerpt, pero en su lugar ejecuta una única petición a la API de Google Translate:

query {
  posts {
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

Funcionalidad ampliada

Las directivas que reciben campos extra pueden proporcionar cálculos adicionales.

Por ejemplo, la directiva @export normalmente exporta el valor de un único campo, como el nombre del usuario autenticado:

query GetLoggedInUserName {
  me {
    name @export(as: "userName")
  }
}

Mediante el argumento affectAdditionalFieldsUnderPos, @export puede recibir múltiples campos, y entonces exportará un diccionario que contiene esos campos como entradas:

query GetLoggedInUserNameAndSurname {
  me {
    name
    surname
      @export(
        as: "userProps"
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

@export ahora producirá el siguiente valor en la variable $userProps

{
  "name": "Leo",
  "surname": "Loso"
}

Configuración

Para habilitar o deshabilitar las directivas multi-campo en el esquema GraphQL, ve al módulo "Multi-Field Directives" en la página de Ajustes, y marca/desmarca la casilla Enable multi-field directives?:

Ajustes para Multi-Field Directives
Ajustes para Multi-Field Directives

Para habilitar o deshabilitar las directivas multi-campo en un endpoint específico, selecciona la opción deseada en el bloque "Multi-Field Directives" desde la correspondiente Schema Configuration:

Multi-Field Directives en la Schema Configuration
Multi-Field Directives en la Schema Configuration