Schema 教程
Schema 教程第2课:查询动态数据

第2课:查询动态数据

Gato GraphQL 通过使用"函数"字段(一种提供功能而非数据的特殊字段类型),可以进一步增强 WordPress 的数据检索能力,使我们能够动态计算数据,将其重新输入到 Query 中,并对响应进行精细控制。

示例

Gato GraphQL 以全局字段的概念提供函数字段:这些字段可在 GraphQL schema 的所有类型下访问。(相比之下,GraphQL 中的普通字段只能在某些特定类型下访问,例如 PostUser)。

按照惯例,Gato GraphQL 的全局字段以 _ 开头(普通字段则不然)。

PHP Functions Via Schema 扩展将许多最常用的 PHP 函数作为全局字段提供,包括:

  • _arrayItem
  • _arrayJoin
  • _date
  • _equals
  • _inArray
  • _intAdd
  • _isEmpty
  • _isNull
  • _makeTime
  • _objectProperty
  • _sprintf
  • _strContains
  • _strRegexReplace
  • _strSubstr
  • _time,
  • 以及更多...

我们可以创建动态生成的数据,并将其输入到过滤器中以获取文章、评论等内容。

此 Query 检索过去 24 小时内添加到站点的评论数,计算方式为"当前时间减去 86400 秒":

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

此 Query 检索从"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 } } )
}

此 Query 与前一个相同,但它从 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
  )
}

字段 _envPHP Constants and Environment Variables via Schema 扩展提供。

通过应用的 Schema 配置和插件设置,我们可以配置哪些常量和环境变量可以被查询