Query Functions
Query FunctionsПоле над полем

Поле над полем

Included in the “Power Extensions” bundle

Директива @applyField — для выполнения определённого поля над значением разрешённого поля.

Описание

Применённая к некоторому полю, директива @applyField позволяет выполнить другое поле (доступное на том же типе и применяемое к тому же объекту), а затем либо передать полученное значение следующей директиве, либо перезаписать значение поля.

Это позволяет нам манипулировать значением поля различными способами, применяя функциональность, предоставляемую расширением PHP Functions via Schema, и сохраняя новый результат в ответе.

В приведённом ниже запросе поле Post.title объекта имеет значение "Hello world!". Добавив @applyField для выполнения поля _strUpperCase (и предварив его директивой @passOnwards, которая экспортирует значение поля в динамическую переменную $input):

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

...значение поля преобразуется в верхний регистр, давая:

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

Можно выстраивать в цепочку несколько @applyFunction, используя ответ одного как входные данные для другого, тем самым выполняя несколько операций над одним и тем же значением поля.

В приведённом ниже запросе применяются 2 операции @applyFunction:

  1. Преобразование в верхний регистр с передачей значения дальше под именем $ucTitle
  2. Замена " " на "-" и перезапись значения поля
{
  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
      )
  }
}

...в результате:

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

Дополнительные примеры

Получить значение, противоположное тому, что возвращает поле:

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

Совместно с расширением Data Iteration Meta Directives — обработать все элементы массива, обрезав каждый до не более чем 20 символов:

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

Совместно с расширением Data Iteration Meta Directives — преобразовать первый элемент массива в верхний регистр:

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