Configurare lo schema
Configurare lo schemaUsare "field to input"

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: "..."
    }
  )
}