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

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:
