Configurar o schema
Configurar o schemaUsando diretivas multi-campo

Usando diretivas multi-campo

Uma diretiva multi-campo é uma diretiva que pode ser aplicada a múltiplos campos, em vez de apenas um. Quando habilitada, um argumento affectAdditionalFieldsUnderPos é adicionado a todas as diretivas, onde as posições relativas dos campos adicionais aos quais aplicar a diretiva podem ser especificadas.

Por exemplo, na seguinte query, a diretiva @strTranslate é aplicada apenas ao campo content:

{
  posts {
    excerpt
    content @strTranslate
  }
}

A diretiva @strTranslate também pode ser aplicada ao campo excerpt, adicionando o argumento de diretiva affectAdditionalFieldsUnderPos com o valor [1] (pois 1 é a posição relativa do campo excerpt em relação à diretiva @strTranslate):

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

O número de campos a adicionar não é limitado. Nesta query, o dateStr também está sendo traduzido:

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

O campo ao qual a diretiva é aplicada naturalmente (como content em todas as queries acima) não deve ser especificado no argumento.

Na query acima, as posições relativas da diretiva @strTranslate em relação aos campos anteriores são:

  • Posição 2: dateStr
  • Posição 1: excerpt
  • Posição 0: content <= É implícito, sempre aplicado

Casos de uso

Existem dois casos de uso principais para este recurso:

  1. Desempenho
  2. Funcionalidade estendida

Desempenho

Para diretivas que executam chamadas a APIs externas, quanto menor o número de requisições que executam, mais rapidamente serão resolvidas.

Esse é o caso da diretiva @strTranslate, que se conecta à API do Google Translate. Normalmente, para traduzir os campos content e excerpt de uma lista de posts, a query seria esta:

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

Ao adicionar @strTranslate duas vezes, essa query executa duas requisições à API do Google Translate (uma para traduzir todos os valores de excerpt, outra para todos os valores de content).

Graças ao recurso Multi-Field Directives, a query abaixo também traduz todos os valores para os campos content e excerpt, mas executa apenas uma única requisição à API do Google Translate:

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

Funcionalidade Estendida

Diretivas que recebem campos extras podem fornecer cálculos adicionais.

Por exemplo, a diretiva @export normalmente exporta o valor de um único campo, como o nome do usuário logado:

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

Por meio do argumento affectAdditionalFieldsUnderPos, @export pode receber múltiplos campos, e então exportará um dicionário contendo esses campos como entradas:

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

@export produzirá agora o seguinte valor na variável $userProps

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

Configuração

Para habilitar ou desabilitar as diretivas multi-campo no schema GraphQL, vá ao módulo "Multi-Field Directives" na página de Configurações, e marque/desmarque a caixa de seleção Enable multi-field directives?:

Configurações para Multi-Field Directives
Configurações para Multi-Field Directives

Para habilitar ou desabilitar as diretivas multi-campo em um endpoint específico, selecione a opção desejada no bloco "Multi-Field Directives" da Schema Configuration correspondente:

Multi-Field Directives na Schema Configuration
Multi-Field Directives na Schema Configuration