บทช่วยสอน Schema
บทช่วยสอน Schemaบทเรียนที่ 2: การ query ข้อมูลแบบไดนามิก

บทเรียนที่ 2: การ query ข้อมูลแบบไดนามิก

Gato GraphQL สามารถเสริมความสามารถของ WordPress ในการค้นหาข้อมูลได้ยิ่งขึ้น ผ่านการใช้ฟิลด์ "function" (ฟิลด์ชนิดพิเศษที่ให้ฟังก์ชันการทำงานแทนที่จะให้ข้อมูล) ซึ่งช่วยให้เราคำนวณข้อมูลแบบไดนามิก ป้อนกลับเข้าไปใน query และส่งผลต่อ response ได้อย่างละเอียด

ตัวอย่าง

Gato GraphQL ให้บริการฟิลด์ function ภายใต้แนวคิดของ Global fields: ฟิลด์ที่สามารถเข้าถึงได้จากทุกประเภทใน GraphQL schema (ในทางกลับกัน ฟิลด์ปกติใน GraphQL จะเข้าถึงได้เฉพาะจากบางประเภทเท่านั้น เช่น Post หรือ User)

ตามธรรมเนียม global fields ใน Gato GraphQL จะขึ้นต้นด้วย _ (ส่วนฟิลด์ปกติจะไม่ขึ้นต้นด้วย _)

ส่วนขยาย PHP Functions Via Schema ให้บริการฟังก์ชัน PHP ที่ใช้บ่อยที่สุดหลายตัวในรูปแบบ global fields ซึ่งรวมถึง:

  • _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 ซึ่งช่วยให้เราดึงค่าของฟิลด์หนึ่งและป้อนเข้าไปในอีกฟิลด์หนึ่งภายในออเปอเรชันเดียวกัน

ฟิลด์ที่ต้องการดึงค่ามาจะถูกอ้างอิงด้วยไวยากรณ์ "Variable" คือ $ และใส่ __ ไว้หน้า alias หรือชื่อของฟิลด์:

{
  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 นี้เหมือนกับ query ก่อนหน้า แต่จะดึงรูปแบบเวลามาตรฐาน "Y-m-d\\TH:i:sO" จาก PHP constant DATE_ISO8601:

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

ผ่านการตั้งค่า Schema Configuration ที่ใช้และ Settings ของปลั๊กอิน เราสามารถกำหนดค่าว่า constant และ environment variable ใดบ้างที่สามารถ query ได้