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