Query Functions
Query FunctionsCampo sobre Campo

Campo sobre Campo

Included in the “Power Extensions” bundle

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:

  1. Transformar em maiúsculas, e passar o valor adiante sob $ucTitle
  2. 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
        )
  }
}