Bài 2: Truy vấn dữ liệu động
Gato GraphQL có thể mở rộng thêm khả năng của WordPress trong việc tìm kiếm dữ liệu thông qua việc sử dụng các trường "hàm" (một loại trường riêng biệt cung cấp chức năng thay vì dữ liệu), cho phép chúng ta tính toán dữ liệu động, đưa nó trở lại vào truy vấn, và ảnh hưởng đến phản hồi với khả năng kiểm soát chi tiết.
Ví dụ
Gato GraphQL cung cấp các trường hàm thông qua khái niệm Trường toàn cục: Các trường có thể truy cập dưới tất cả các kiểu trong schema GraphQL. (Ngược lại, các trường bình thường trong GraphQL chỉ có thể truy cập dưới một số kiểu cụ thể như Post hoặc User).
Theo quy ước, các trường toàn cục trong Gato GraphQL bắt đầu bằng _ (trong khi các trường bình thường thì không).
Extension PHP Functions Via Schema cung cấp nhiều hàm PHP phổ biến nhất dưới dạng các trường toàn cục, bao gồm:
_arrayItem_arrayJoin_date_equals_inArray_intAdd_isEmpty_isNull_makeTime_objectProperty_sprintf_strContains_strRegexReplace_strSubstr_time,- Và nhiều hơn nữa...
Chúng ta có thể tạo dữ liệu được sinh ra động, và đưa nó vào bộ lọc để lấy bài viết, bình luận, v.v.
Truy vấn này lấy số lượng bình luận được thêm vào trang web trong 24 giờ qua, được tính là "thời gian hiện tại trừ đi 86400 giây":
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 là một biến được tạo động bởi extension Field to Input, cho phép chúng ta lấy giá trị của một trường và đưa nó vào một trường khác trong cùng một thao tác.
Trường cần lấy giá trị được tham chiếu bằng cú pháp "Biến" $, và __ trước alias hoặc tên trường:
{
posts {
excerpt
# Referencing previous field with name "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Referencing previous field with alias "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}Truy vấn này lấy số lượng bình luận được thêm vào trang web tính từ "24 giờ trước", "1 năm trước", "đầu tháng", và "đầu năm":
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 } } )
}Truy vấn này giống với truy vấn trước, tuy nhiên nó lấy định dạng thời gian chuẩn "Y-m-d\\TH:i:sO" từ hằng số PHP 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
)
}Trường _env được cung cấp thông qua extension PHP Constants and Environment Variables via Schema.
Thông qua Schema Configuration được áp dụng và cài đặt plugin, chúng ta có thể cấu hình hằng số và biến môi trường nào có thể được truy vấn.