Campo sobre Campo
Diretiva @applyField, para executar um determinado campo sobre o valor resolvido do campo.
Descrição
Aplicada a um determinado campo, a diretiva @applyField permite executar outro campo (disponível no mesmo tipo e aplicado no mesmo objeto), e então passar o valor resultante para outra diretiva, ou substituir o valor do campo.
Isso nos permite manipular o valor do campo de diversas maneiras, aplicando funcionalidades fornecidas pela extensão PHP Functions via Schema, e armazenando o novo resultado na resposta.
Na query abaixo, o campo Post.title para o objeto tem o valor "Hello world!". Ao adicionar @applyField para executar o campo _strUpperCase (precedido de @passOnwards, que exporta o valor do campo sob a variável dinâmica $input):
{
post(by: { id: 1 }) {
title
@passOnwards(as: "input")
@applyField(
name: "_strUpperCase"
arguments: {
text: $input
},
setResultInResponse: true
)
}
}...o valor do campo é transformado em maiúsculas, produzindo:
{
"data": {
"post": {
"title": "HELLO WORLD!"
}
}
}Podemos concatenar múltiplos @applyFunction, usando a resposta de um como entrada em outro, realizando assim múltiplas operações sobre o mesmo valor de campo.
Na query abaixo, são aplicadas 2 operações @applyFunction:
- Transformar em maiúsculas, e passar o valor adiante sob
$ucTitle - Substituir
" "por"-"e sobrescrever o valor do campo
{
post(by: { id: 1 }) {
title
@passOnwards(as: "input")
@applyField(
name: "_strUpperCase"
arguments: {
text: $input
},
passOnwardsAs: "ucTitle"
)
@applyField(
name: "_strReplace"
arguments: {
search: " ",
replaceWith: "-",
in: $ucTitle
},
setResultInResponse: true
)
}
}...produzindo:
{
"data": {
"post": {
"title": "HELLO-WORLD!"
}
}
}Outros exemplos
Recuperar o valor oposto ao fornecido pelo campo:
{
posts {
id
notHasComments: hasComments
@passOnwards(as: "hasComments")
@applyField(
name: "_not",
arguments: {
value: $hasComments
},
setResultInResponse: true
)
}
}Juntamente com a extensão Data Iteration Meta Directives, manipular todos os itens de um array, encurtando cada um para no máximo 20 caracteres:
{
posts {
categoryNames
@underEachArrayItem(passValueOnwardsAs: "categoryName")
@applyField(
name: "_strSubstr"
arguments: {
string: $categoryName,
offset: 0,
length: 20
},
setResultInResponse: true
)
}
}Juntamente com a extensão Data Iteration Meta Directives, converter o primeiro item de um array em maiúsculas:
{
posts {
categoryNames
@underArrayItem(passOnwardsAs: "value", index: 0)
@applyField(
name: "_strUpperCase"
arguments: {
text: $value
},
setResultInResponse: true
)
}
}