Używanie "field to input"
Pobierz wartość pola, przetworz ją i przekaż jako wejście do innego pola — wszystko w ramach jednego query.
Jak używać
Pole, z którego chcemy pobrać wartość, jest odwoływane przy użyciu składni "Variable" $ oraz __ przed aliasem lub nazwą pola. (Na przykład wartość pola excerpt jest odwoływana jako $__excerpt.) Odpowiedź z drugiego pola może z kolei zostać użyta jako wejście do kolejnego pola:
{
posts {
excerpt
# Odwołanie do poprzedniego pola o nazwie "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Odwołanie do poprzedniego pola z aliasem "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}Odpowiedź będzie następująca:
{
"data": {
"posts": [
{
"excerpt": "Some post excerpt",
"isEmptyExcerpt": false,
"isNotEmptyExcerpt": true
},
{
"excerpt": "",
"isEmptyExcerpt": true,
"isNotEmptyExcerpt": false
}
]
}
}Pole może być odwoływane tylko przez wcześniejsze pola siostrzane w tym samym węźle. Następujące queries NIE będą działać:
# To się nie powiedzie, ponieważ odwołanie do pola musi pojawić się po nim, nie przed
{
posts {
isEmptyExcerpt: _isEmpty(value: $__excerpt)
excerpt
}
}
# To się nie powiedzie, ponieważ odwołanie musi być wykonane w tym samym węźle
{
posts {
excerpt
}
isEmptyExcerpt: _isEmpty(value: $__excerpt)
}Pola nie można również odwoływać z argumentu dyrektywy (w tym celu użyj dyrektywy @passOnwards):
# To się nie powiedzie, ponieważ odwołanie może być używane tylko jako wejście do pola, nie do dyrektywy
{
posts {
hasComments
title @include(if: $__hasComments)
}
}Przykłady
Jeśli excerpt posta jest pusty, użyj zamiast niego tytułu:
{
posts {
title
originalExcerpt: excerpt
isEmptyExcerpt: _isEmpty(value: $__originalExcerpt)
excerpt: if(condition: $__isEmptyExcerpt, then: $__title, else: $__originalExcerpt)
}
}Pobierz dane z zewnętrznego endpointu REST i przetworz je zgodnie ze swoimi potrzebami.
{
externalData: _getJSON(url: "https://example.com/rest/some-external-endpoint")
userName: _extract(object: $__externalData, path: "data.user.name")
userLastName: _extract(object: $__externalData, path: "data.user.surname")
}To wygeneruje:
{
"data": {
"externalData": {
"data": {
"user": {
"id": 1,
"name": "Leo",
"surname": "Loso"
}
}
},
"userName": "Leo",
"userLastName": "Loso"
}
}Używając dyrektywy @remove na externalData, możemy również uniknąć wyświetlania danych źródłowych zewnętrznego endpointu w odpowiedzi:
{
externalData: _getJSON(url: "https://example.com/rest/some-external-endpoint") @remove
userName: _extract(object: $__externalData, path: "data.user.name")
userLastName: _extract(object: $__externalData, path: "data.user.surname")
}Teraz wygeneruje to:
{
"data": {
"userName": "Leo",
"userLastName": "Loso"
}
}Pobierz posty dla każdego użytkownika, które zawierają adres e-mail tego użytkownika:
{
users {
email
posts(filter: { search: $__email }) {
id
title
}
}
}Wyślij newsletter, definiując adresy e-mail to i from za pomocą pola optionValue:
mutation {
fromEmail: optionValue(name: "admin_email")
toEmail: optionValue(name: "subscribers_email_list_recipient_address")
_sendEmail(
from: {
email: $__fromEmail
}
to: $__toEmail
subject: "Weekly summary"
messageAs: {
html: "..."
}
)
}