Использование многополевых директив
Многополевая директива — это директива, которую можно применять к нескольким полям, а не только к одному. Когда эта функция включена, ко всем директивам добавляется аргумент 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<= подразумевается неявно, применяется всегда
Сценарии использования
Для данной функции существует два основных сценария использования:
- Производительность
- Расширенная функциональность
Производительность
Для директив, выполняющих обращения к внешним 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?:

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