스키마 튜토리얼
스키마 튜토리얼레슨 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
      }
    }
  ) 
}

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

필드 _envPHP Constants and Environment Variables via Schema 확장 기능을 통해 제공됩니다.

적용된 스키마 설정과 플러그인 설정을 통해 쿼리할 수 있는 상수 및 환경 변수를 구성할 수 있습니다.