บทเรียนที่ 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 ได้