Query-functies
Query-functiesField To Input

Field To Input

Included in the “Power Extensions” bundle

Haal de waarde van een veld op, bewerk deze en geef hem door als invoer aan een ander veld of een andere directive — alles binnen dezelfde operatie.

Geef de waarde van veld field als invoer door aan een ander veld via $__field, en als invoer aan een directive via field @passOnwards(as: "variableName").

$__field

Geef de veldwaarde als invoer door aan een ander veld. De syntaxis om naar de veldwaarde te verwijzen is: $ (het symbool voor een variabele in GraphQL), gevolgd door __ en de alias of naam van het veld.

De waarde van veld excerpt wordt bijvoorbeeld aangeduid als $__excerpt, en postTitle: title als $__postTitle.

De respons van het tweede veld kan zelf ook als invoer worden gebruikt voor een ander veld:

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

De respons zal zijn:

{
  "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)
}

Het veld kan ook niet worden aangehaald vanuit een directive-argument (gebruik daarvoor @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

Directive @passOnwards maakt de opgeloste waarde van een veld beschikbaar voor volgende directives via een dynamische variabele.

In de onderstaande query wordt veld notHasComments samengesteld door de waarde van veld hasComments op te halen en de tegengestelde waarde te berekenen. Dit werkt als volgt:

  • De veldwaarde wordt beschikbaar gesteld via @passOnwards; de veldwaarde kan vervolgens als invoer worden doorgegeven aan elke volgende directive
  • @applyField neemt de invoer (geëxporteerd onder dynamische variabele $postHasComments), past het globale veld not erop toe en slaat het resultaat terug op in het veld
{
  posts {
    id
    hasComments
    notHasComments: hasComments
      @passOnwards(as: "postHasComments")
      @applyField(
        name: "_not"
        arguments: {
          value: $postHasComments
        },
        setResultInResponse: true
      )
  }
}

Dit levert het volgende op:

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

Je kunt ook de waarde ophalen van een willekeurig opgelost veld in het object, door de alias of de veldnaam door te geven als het argument property.

In deze query benaderen we bijvoorbeeld de opgeloste waarde via de veldnaam id of de alias second, en exporteren we die waarde via een dynamische variabele om hem in een volgende query af te drukken:

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)
}

Dit levert het volgende op:

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

Voorbeelden

Als het uittreksel van een bericht leeg is, gebruik dan in plaats daarvan de titel:

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

Haal gegevens op van een extern REST-eindpunt en bewerk ze naar wens.

{
  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" })
}

Dit levert het volgende op:

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

Door de directive @remove op externalData te gebruiken, kunnen we ook voorkomen dat de brongegevens van het externe eindpunt in de respons worden afgedrukt:

{
  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" })
}

Dit levert nu het volgende op:

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

Haal de berichten op van elke gebruiker die het e-mailadres van die gebruiker vermelden:

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

Verstuur een nieuwsbrief waarbij je de to- en from-e-mailadressen definieert via het veld 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: "..."
    }
  )
}

Voer voorwaardelijke bewerkingen uit op basis van de veldwaarde. In deze query worden de namen van gebruikers "Leo" en "Peter" omgezet naar hoofdletters, omdat zij in de array "speciale gebruikers" staan, terwijl "Martin" dat niet wordt:

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

...wat het volgende oplevert:

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