Schema-Tutorial
Schema-TutorialLektion 2: Dynamische Daten abfragen

Lektion 2: Dynamische Daten abfragen

Gato GraphQL kann die Fähigkeiten von WordPress zur Datensuche durch den Einsatz von „Funktions"-Feldern (eine besondere Art von Feld, das Funktionalität statt Daten bereitstellt) weiter ausbauen und ermöglicht es uns, Daten dynamisch zu berechnen, sie wieder in die Query einzuspeisen und die Antwort mit granularer Kontrolle zu beeinflussen.

Beispiele

Gato GraphQL stellt Funktionsfelder über das Konzept der Globalen Felder bereit: Felder, die unter allen Typen des GraphQL-Schemas zugänglich sind. (Normale Felder in GraphQL sind dagegen nur unter einem bestimmten Typ zugänglich, wie z. B. Post oder User).

Per Konvention beginnen globale Felder in Gato GraphQL mit _ (normale Felder hingegen nicht).

Die Erweiterung PHP Functions Via Schema stellt viele der gängigsten PHP-Funktionen als globale Felder bereit, darunter:

  • _arrayItem
  • _arrayJoin
  • _date
  • _equals
  • _inArray
  • _intAdd
  • _isEmpty
  • _isNull
  • _makeTime
  • _objectProperty
  • _sprintf
  • _strContains
  • _strRegexReplace
  • _strSubstr
  • _time,
  • Und viele mehr...

Wir können dynamisch generierte Daten erstellen und sie in einen Filter einspeisen, um Posts, Kommentare usw. abzurufen.

Diese Query ruft die Anzahl der Kommentare ab, die in den letzten 24 Stunden zur Website hinzugefügt wurden – berechnet als „aktuelle Zeit minus 86400 Sekunden":

query {
  timeNow: _time  
  time24HsAgo: _intSubtract(
    subtract: 86400,
    from: $__timeNow
  )
  date24HsAgo: _date(
    format: "Y-m-d\\TH:i:sO",
    timestamp: $__time24HsAgo
  )  
  commentsAddedInLast24Hs: commentCount(
    filter: {
      dateQuery: {
        after: $__date24HsAgo
      }
    }
  ) 
}

$__timeNow ist eine Variable, die dynamisch von der Erweiterung Field To Input erstellt wird. Sie ermöglicht es uns, den Wert eines Feldes zu lesen und ihn in ein anderes Feld innerhalb derselben Operation einzuspeisen.

Das Feld, aus dem der Wert gelesen werden soll, wird mit der „Variable"-Syntax $ und __ vor dem Alias oder dem Namen des Feldes referenziert:

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

Diese Query ruft die Anzahl der Kommentare ab, die zur Website ab „vor 24 Stunden", „vor 1 Jahr", „Beginn des Monats" und „Beginn des Jahres" hinzugefügt wurden:

query {
  timeNow: _time  
  time24HsAgo: _intSubtract(subtract: 86400, from: $__timeNow)
  date24HsAgo: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__time24HsAgo)  
  time1YearAgo: _intSubtract(subtract: 31536000, from: $__timeNow)
  date1YearAgo: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__time1YearAgo)
  timeBegOfThisMonth: _makeTime(hour: 0, minute: 0, second: 0, day: 1)
  dateBegOfThisMonth: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__timeBegOfThisMonth)
  timeBegOfThisYear: _makeTime(hour: 0, minute: 0, second: 0, month: 1, day: 1)
  dateBegOfThisYear: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__timeBegOfThisYear)
  
  commentsAddedInLast24Hs: commentCount(filter: { dateQuery: { after: $__date24HsAgo } } )  
  commentsAddedInLast1Year: commentCount(filter: { dateQuery: { after: $__date1YearAgo } } )  
  commentsAddedSinceBegOfThisMonth: commentCount(filter: { dateQuery: { after: $__dateBegOfThisMonth } } )  
  commentsAddedSinceBegOfThisYear: commentCount(filter: { dateQuery: { after: $__dateBegOfThisYear } } )
}

Diese Query ist identisch mit der vorherigen, ruft das standardisierte Zeitformat "Y-m-d\\TH:i:sO" jedoch aus der PHP-Konstante DATE_ISO8601 ab:

query {
  # This PHP constant will provide standard time format "Y-m-d\\TH:i:sO"
  DATE_ISO8601: _env(name: DATE_ISO8601)
  timeNow: _time  
  time24HsAgo: _intSubtract(
    subtract: 86400,
    from: $__timeNow
  )
  date24HsAgo: _date(
    format: $__DATE_ISO8601,
    timestamp: $__time24HsAgo
  )
}

Das Feld _env wird über die Erweiterung PHP Constants and Environment Variables via Schema bereitgestellt.

Über die angewandte Schema-Konfiguration und die Plugin-Einstellungen können wir konfigurieren, welche Konstanten und Umgebungsvariablen abgefragt werden können.