スキーマチュートリアル
スキーマチュートリアルレッスン2: 動的データのクエリ

レッスン2: 動的データのクエリ

Gato GraphQLは、「関数」フィールド(データの代わりに機能を提供する独自のフィールド)を使用することで、WordPressのデータ検索機能をさらに拡張し、データを動的に計算してクエリに再入力し、きめ細かい制御でレスポンスに影響を与えることができます。

Gato GraphQLは、グローバルフィールドというコンセプトのもとで関数フィールドを提供しています。グローバルフィールドとは、GraphQLスキーマのすべてのタイプからアクセスできるフィールドです。(GraphQLの通常のフィールドは、PostUserなど特定のタイプからのみアクセスできます。)

慣例として、Gato GraphQLのグローバルフィールドは_で始まります(通常のフィールドはそうではありません)。

PHP Functions Via Schema 拡張機能は、最も一般的なPHP関数の多くをグローバルフィールドとして提供しています。含まれるものには以下があります:

  • _arrayItem
  • _arrayJoin
  • _date
  • _equals
  • _inArray
  • _intAdd
  • _isEmpty
  • _isNull
  • _makeTime
  • _objectProperty
  • _sprintf
  • _strContains
  • _strRegexReplace
  • _strSubstr
  • _time,
  • その他多数...

動的に生成されたデータを作成し、フィルターに入力して投稿やコメントなどを取得することができます。

このクエリは、「現在時刻から86400秒を引いた時間」として計算された、過去24時間以内にサイトに追加されたコメント数を取得します:

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は、Field to Input 拡張機能によって動的に作成される変数です。この拡張機能を使うと、フィールドの値を取得して、同じオペレーション内の別のフィールドに入力することができます。

値を取得するフィールドは、「変数」構文$とフィールドのエイリアスまたは名前の前に__を付けて参照します:

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

このクエリは、「24時間前」、「1年前」、「今月の始め」、「今年の始め」からサイトに追加されたコメント数を取得します:

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

このクエリは前のクエリと同じですが、PHP定数DATE_ISO8601から標準化された時間フォーマット"Y-m-d\\TH:i:sO"を取得します:

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

フィールド_envは、PHP Constants and Environment Variables via Schema 拡張機能を通じて提供されます。

適用されたスキーマ設定とプラグインの設定を通じて、クエリできる定数や環境変数を設定することができます。