Query Functions
Query FunctionsCampo sobre Campo

Campo sobre Campo

Included in the “Power Extensions” bundle

Directiva @applyField, para ejecutar un determinado campo sobre el valor resuelto del campo.

Descripción

Aplicada a algún campo, la directiva @applyField permite ejecutar otro campo (que esté disponible en el mismo tipo y se aplique sobre el mismo objeto), y bien pasar ese valor resultante a otra directiva, o sobrescribir el valor del campo.

Esto nos permite manipular el valor del campo de múltiples formas, aplicando alguna funcionalidad proporcionada mediante la extensión PHP Functions via Schema, y almacenando el nuevo resultado en la respuesta.

En la consulta de abajo, el campo Post.title para el objeto tiene el valor "Hello world!". Añadiendo @applyField para ejecutar el campo _strUpperCase (y precediéndolo con @passOnwards, que exporta el valor del campo bajo el dinámico $input):

{
  post(by: { id: 1 }) {
    title
      @passOnwards(as: "input")
      @applyField(
        name: "_strUpperCase"
        arguments: {
          text: $input
        },
        setResultInResponse: true
      )
  }
}

...el valor del campo se transforma a mayúsculas, produciendo:

{
  "data": {
    "post": {
      "title": "HELLO WORLD!"
    }
  }
}

Podemos concatenar múltiples @applyFunction, usando la respuesta de uno como entrada en otro, realizando así múltiples operaciones sobre el mismo valor del campo.

En la consulta de abajo, hay 2 operaciones @applyFunction aplicadas:

  1. Transformar a mayúsculas, y pasar el valor adelante bajo $ucTitle
  2. Reemplazar " " con "-" y sobrescribir el valor del 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
      )
  }
}

...produciendo:

{
  "data": {
    "post": {
      "title": "HELLO-WORLD!"
    }
  }
}

Más ejemplos

Recuperar el valor opuesto al que proporciona el campo:

{
  posts {
    id
    notHasComments: hasComments
      @passOnwards(as: "hasComments")
      @applyField(
        name: "_not",
        arguments: {
          value: $hasComments
        },
        setResultInResponse: true
      )
  }
}

Junto con la extensión Data Iteration Meta Directives, manipular todos los elementos de un array, acortando cada uno a no más de 20 caracteres de largo:

{
  posts {
    categoryNames
      @underEachArrayItem(passValueOnwardsAs: "categoryName")
        @applyField(
          name: "_strSubstr"
          arguments: {
            string: $categoryName,
            offset: 0,
            length: 20
          },
          setResultInResponse: true
        )
  }
}

Junto con la extensión Data Iteration Meta Directives, convertir el primer elemento de un array a mayúsculas:

{
  posts {
    categoryNames
      @underArrayItem(passOnwardsAs: "value", index: 0)
        @applyField(
          name: "_strUpperCase"
          arguments: {
            text: $value
          },
          setResultInResponse: true
        )
  }
}