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:
- Rendimiento
- 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?:

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:
