Настройка схемы
Настройка схемыИспользование многополевых директив

Использование многополевых директив

Многополевая директива — это директива, которую можно применять к нескольким полям, а не только к одному. Когда эта функция включена, ко всем директивам добавляется аргумент affectAdditionalFieldsUnderPos, в котором можно указать относительные позиции дополнительных полей, к которым следует применить директиву.

Например, в следующем запросе директива @strTranslate применяется только к полю content:

{
  posts {
    excerpt
    content @strTranslate
  }
}

Директиву @strTranslate можно также применить к полю excerpt, добавив аргумент директивы affectAdditionalFieldsUnderPos со значением [1] (поскольку 1 — это относительная позиция поля excerpt от директивы @strTranslate):

{
  posts {
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

Количество добавляемых полей не ограничено. В этом запросе также переводится поле dateStr:

{
  posts {
    dateStr
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1, 2]
      )
  }
}

Поле, к которому директива применяется непосредственно (например, content во всех запросах выше), не нужно указывать в аргументе.

В приведённом выше запросе относительные позиции от директивы @strTranslate до предыдущих полей таковы:

  • Позиция 2: dateStr
  • Позиция 1: excerpt
  • Позиция 0: content <= подразумевается неявно, применяется всегда

Сценарии использования

Для данной функции существует два основных сценария использования:

  1. Производительность
  2. Расширенная функциональность

Производительность

Для директив, выполняющих обращения к внешним API, чем меньше запросов они отправляют, тем быстрее они разрешаются.

Именно так работает директива @strTranslate, которая обращается к Google Translate API. Обычно для перевода полей content и excerpt из списка записей запрос выглядит следующим образом:

query {
  posts {
    excerpt @strTranslate
    content @strTranslate
  }
}

Добавляя @strTranslate дважды, этот запрос выполняет два обращения к Google Translate API (одно для перевода всех значений excerpt, другое — для всех значений content).

Благодаря функции Multi-Field Directives приведённый ниже запрос также переводит все значения полей content и excerpt, однако при этом выполняет лишь одно обращение к Google Translate API:

query {
  posts {
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

Расширенная функциональность

Директивы, получающие дополнительные поля, могут выполнять расширенные вычисления.

Например, директива @export в обычном режиме экспортирует значение одного поля — скажем, имя текущего авторизованного пользователя:

query GetLoggedInUserName {
  me {
    name @export(as: "userName")
  }
}

Через аргумент affectAdditionalFieldsUnderPos директива @export может принимать несколько полей и экспортировать словарь, содержащий эти поля в качестве записей:

query GetLoggedInUserNameAndSurname {
  me {
    name
    surname
      @export(
        as: "userProps"
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

@export теперь поместит в переменную $userProps следующее значение:

{
  "name": "Leo",
  "surname": "Loso"
}

Настройка

Чтобы включить или отключить многополевые директивы в схеме GraphQL, перейдите в модуль «Multi-Field Directives» на странице настроек и установите или снимите флажок Enable multi-field directives?:

Настройки Multi-Field Directives
Настройки Multi-Field Directives

Чтобы включить или отключить многополевые директивы для конкретного endpoint, выберите нужный параметр в блоке «Multi-Field Directives» соответствующей Schema Configuration:

Multi-Field Directives в Schema Configuration
Multi-Field Directives в Schema Configuration