Konfigurowanie schematu
Konfigurowanie schematuUżywanie "field to input"

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