Query Functions
Query FunctionsField To Input

Field To Input

Included in the “Power Extensions” bundle

Récupère la valeur d'un champ, la manipule et la passe en entrée à un autre champ ou directive, le tout dans la même opération.

Passe la valeur du champ field en entrée à un autre champ via $__field, et en entrée à une directive via field @passOnwards(as: "variableName").

$__field

Passe la valeur du champ en entrée à un autre champ. La syntaxe pour référencer la valeur du champ est : $ (c'est-à-dire le symbole d'une variable en GraphQL), suivi de __ et de l'alias ou du nom du champ.

Par exemple, la valeur du champ excerpt est référencée comme $__excerpt, et postTitle: title est référencée comme $__postTitle.

La réponse du deuxième champ peut elle-même être utilisée en entrée d'un autre champ :

{
  posts {
    excerpt
 
    # Referencing previous field with name "excerpt"
    isEmptyExcerpt: _isEmpty(value: $__excerpt)
 
    # Referencing previous field with alias "isEmptyExcerpt"
    isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
  }
}

La réponse sera :

{
  "data": {
    "posts": [
      {
        "excerpt": "Some post excerpt",
        "isEmptyExcerpt": false,
        "isNotEmptyExcerpt": true
      },
      {
        "excerpt": "",
        "isEmptyExcerpt": true,
        "isNotEmptyExcerpt": false
      }
    ]
  }
}
# This will fail because the reference to the field must appear after the field, not before
{
  posts {
    isEmptyExcerpt: _isEmpty(value: $__excerpt)
    excerpt
  }
}
 
# This will fail because the reference must be done within the same node
{
  posts {
    excerpt
  }
  isEmptyExcerpt: _isEmpty(value: $__excerpt)
}

Le champ ne peut pas non plus être référencé depuis un argument de directive (pour cela, utilisez @passOnwards) :

# This will fail because the reference can be only used as input to a field, not to a directive
{
  posts {
    hasComments
    title @include(if: $__hasComments)
  }
}

@passOnwards

La directive @passOnwards rend la valeur résolue du champ disponible pour les directives suivantes via une variable dynamique.

Dans la requête ci-dessous, le champ notHasComments est composé en obtenant la valeur du champ hasComments et en calculant sa valeur opposée. Cela fonctionne ainsi :

  • La valeur du champ est rendue disponible via @passOnwards ; elle peut ensuite être passée en entrée à toute directive suivante
  • @applyField prend l'entrée (exportée sous la variable dynamique $postHasComments), applique le champ global not dessus, et stocke le résultat dans le champ
{
  posts {
    id
    hasComments
    notHasComments: hasComments
      @passOnwards(as: "postHasComments")
      @applyField(
        name: "_not"
        arguments: {
          value: $postHasComments
        },
        setResultInResponse: true
      )
  }
}

Cela produira :

{
  "data": {
    "posts": [
      {
        "id": 1724,
        "hasComments": true,
        "notHasComments": false
      },
      {
        "id": 358,
        "hasComments": false,
        "notHasComments": true
      },
      {
        "id": 555,
        "hasComments": false,
        "notHasComments": true
      }
    ]
  }
}

Nous pouvons également récupérer la valeur de n'importe quel champ résolu dans l'objet, en passant soit l'alias soit le nom du champ sous l'arg property.

Par exemple, dans cette requête, nous accédons à la valeur résolue par le nom du champ id, ou l'alias second, et nous exportons cette valeur via une variable dynamique pour l'afficher dans une requête suivante :

query One {
  id
  second: _echo(value: 2)
    @passOnwards(
      property: "id",
      as: "resolvedFirstValue"
    )
    @exportFrom(
      scopedDynamicVariable: $resolvedFirstValue,
      as: "firstValue"
    )
  third: _echo(value: 3)
    @passOnwards(
      property: "second",
      as: "resolvedSecondValue"
    )
    @exportFrom(
      scopedDynamicVariable: $resolvedSecondValue,
      as: "secondValue"
    )
}
 
query Two @depends(on: "One") {
  firstValue: _echo(value: $firstValue)
  secondValue: _echo(value: $secondValue)
}

Cela produira :

{
  "data": {
    "id": "root",
    "second": 2,
    "third": 3,
    "firstValue": "root",
    "secondValue": 2
  }
}

Exemples

Si l'extrait de l'article est vide, utiliser le titre à la place :

{
  posts {
    title
    originalExcerpt: excerpt
    isEmptyExcerpt: _isEmpty(value: $__originalExcerpt)
    excerpt: _if(condition: $__isEmptyExcerpt, then: $__title, else: $__originalExcerpt)
  }
}

Récupérer des données depuis un endpoint REST externe, et manipuler ces données selon vos besoins.

{
  externalData: _sendJSONObjectItemHTTPRequest(input: { url: "https://example.com/rest/some-external-endpoint"} )
  userName: _objectProperty(object: $__externalData, by: { path: "data.user.name" })
  userLastName: _objectProperty(object: $__externalData, by: { path: "data.user.surname" })
}

Cela produira :

{
  "data": {
    "externalData": {
      "data": {
        "user": {
          "id": 1,
          "name": "Leo",
          "surname": "Loso"
        }
      }
    },
    "userName": "Leo",
    "userLastName": "Loso"
  }
}

En utilisant la directive @remove sur externalData, nous pouvons également éviter d'afficher les données sources de l'endpoint externe dans la réponse :

{
  externalData: _sendJSONObjectItemHTTPRequest(input: { url: "https://example.com/rest/some-external-endpoint" } ) @remove
  userName: _objectProperty(object: $__externalData, by: { path: "data.user.name" })
  userLastName: _objectProperty(object: $__externalData, by: { path: "data.user.surname" })
}

Cela produira maintenant :

{
  "data": {
    "userName": "Leo",
    "userLastName": "Loso"
  }
}

Récupérer les articles pour chaque utilisateur mentionnant l'e-mail de l'utilisateur :

{
  users {
    email
    posts(filter: { search: $__email }) {
      id
      title
    }
  }
}

Envoyer une newsletter en définissant les e-mails to et from via le champ 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: "..."
    }
  )
}

Exécuter des opérations conditionnelles basées sur la valeur du champ. Dans cette requête, les utilisateurs "Leo" et "Peter" voient leurs noms convertis en majuscules, car ils figurent dans le tableau des « utilisateurs spéciaux », tandis que "Martin" ne l'est pas :

query {
  users {
    name
      @passOnwards(as: "userName")
      @applyField(
        name: "_inArray"
        arguments: {
          value: $userName
          array: ["Leo", "John", "Peter"]
        }
        passOnwardsAs: "isSpecialUser"
      )
      @if(
        condition: $isSpecialUser
      )
        @strUpperCase
  }
}

...produisant :

{
  "data": {
    "users": [
      {
        "name": "LEO"
      },
      {
        "name": "Martin"
      },
      {
        "name": "PETER"
      }
    ]
  }
}