Usare "field to input"
Ottieni il valore di un campo, manipolalo e inseriscilo in un altro campo, tutto nella stessa query.
Come si usa
Il campo da cui si vuole ottenere il valore viene referenziato usando la sintassi "Variable" $, e __ prima dell'alias o del nome del campo. (Ad esempio, il valore del campo excerpt viene referenziato come $__excerpt.) La risposta del secondo campo può essere a sua volta usata come input per un altro campo:
{
posts {
excerpt
# Riferimento al campo precedente con il nome "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Riferimento al campo precedente con l'alias "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}La risposta sarà :
{
"data": {
"posts": [
{
"excerpt": "Some post excerpt",
"isEmptyExcerpt": false,
"isNotEmptyExcerpt": true
},
{
"excerpt": "",
"isEmptyExcerpt": true,
"isNotEmptyExcerpt": false
}
]
}
}Il campo può essere referenziato solo da uno dei suoi campi fratelli precedenti nello stesso nodo. Le seguenti queries NON funzioneranno:
# Questo fallirà perché il riferimento al campo deve apparire dopo il campo, non prima
{
posts {
isEmptyExcerpt: _isEmpty(value: $__excerpt)
excerpt
}
}
# Questo fallirà perché il riferimento deve essere fatto nello stesso nodo
{
posts {
excerpt
}
isEmptyExcerpt: _isEmpty(value: $__excerpt)
}Il campo non può nemmeno essere referenziato dall'argomento di una direttiva (per questo, usa la direttiva @passOnwards):
# Questo fallirà perché il riferimento può essere usato solo come input di un campo, non di una direttiva
{
posts {
hasComments
title @include(if: $__hasComments)
}
}Esempi
Se l'estratto del post è vuoto, usa il titolo al suo posto:
{
posts {
title
originalExcerpt: excerpt
isEmptyExcerpt: _isEmpty(value: $__originalExcerpt)
excerpt: if(condition: $__isEmptyExcerpt, then: $__title, else: $__originalExcerpt)
}
}Recupera dati da un endpoint REST esterno e manipolali per adattarli alle tue esigenze.
{
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")
}Questo produrrà :
{
"data": {
"externalData": {
"data": {
"user": {
"id": 1,
"name": "Leo",
"surname": "Loso"
}
}
},
"userName": "Leo",
"userLastName": "Loso"
}
}Usando la direttiva @remove su externalData, possiamo anche evitare di stampare i dati sorgente dell'endpoint esterno nella risposta:
{
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")
}Questo produrrà ora:
{
"data": {
"userName": "Leo",
"userLastName": "Loso"
}
}Recupera i post per ogni utente che menziona l'email dell'utente:
{
users {
email
posts(filter: { search: $__email }) {
id
title
}
}
}Invia una newsletter definendo le email to e from tramite il campo 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: "..."
}
)
}