การใช้งาน Multi-Field Directives
Multi-field directive คือ directive ที่สามารถนำไปใช้กับหลายฟิลด์พร้อมกัน แทนที่จะใช้กับฟิลด์เดียวเท่านั้น เมื่อเปิดใช้งาน อาร์กิวเมนต์ affectAdditionalFieldsUnderPos จะถูกเพิ่มเข้าไปในทุก directive ซึ่งช่วยให้ระบุตำแหน่งสัมพัทธ์ของฟิลด์เพิ่มเติมที่ต้องการนำ directive ไปใช้ได้
ตัวอย่างเช่น ใน query ต่อไปนี้ directive @strTranslate ถูกใช้กับฟิลด์ content เท่านั้น:
{
posts {
excerpt
content @strTranslate
}
}หากต้องการนำ directive @strTranslate ไปใช้กับฟิลด์ excerpt ด้วย ให้เพิ่มอาร์กิวเมนต์ affectAdditionalFieldsUnderPos พร้อมค่า [1] (เนื่องจาก 1 คือตำแหน่งสัมพัทธ์ของฟิลด์ excerpt จาก directive @strTranslate):
{
posts {
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1]
)
}
}จำนวนฟิลด์ที่เพิ่มได้ไม่มีการจำกัด ใน query นี้ dateStr ก็ถูกแปลด้วยเช่นกัน:
{
posts {
dateStr
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1, 2]
)
}
}ฟิลด์ที่ directive ถูกนำไปใช้โดยตรง (เช่น content ใน query ทั้งหมดข้างต้น) ไม่จำเป็นต้องระบุในอาร์กิวเมนต์
ใน query ข้างต้น ตำแหน่งสัมพัทธ์จาก directive @strTranslate ไปยังฟิลด์ก่อนหน้ามีดังนี้:
- ตำแหน่ง
2:dateStr - ตำแหน่ง
1:excerpt - ตำแหน่ง
0:content<= ใช้งานโดยปริยาย เสมอ
กรณีการใช้งาน
ฟีเจอร์นี้มีกรณีการใช้งานหลักสองประการ:
- ประสิทธิภาพ
- ฟังก์ชันการทำงานที่ขยายเพิ่มเติม
ประสิทธิภาพ
สำหรับ directive ที่เรียกใช้ API ภายนอก จำนวนคำขอที่น้อยลงย่อมหมายถึงการแก้ไขที่รวดเร็วขึ้น
กรณีนี้เกิดขึ้นกับ directive @strTranslate ซึ่งเชื่อมต่อกับ Google Translate API โดยปกติ หากต้องการแปลฟิลด์ content และ excerpt จากรายการโพสต์ query จะเป็นดังนี้:
query {
posts {
excerpt @strTranslate
content @strTranslate
}
}การเพิ่ม @strTranslate สองครั้งทำให้ query นี้ส่งคำขอไปยัง Google Translate API สองครั้ง (ครั้งหนึ่งสำหรับแปลค่าทั้งหมดของ excerpt และอีกครั้งสำหรับ content)
ด้วยฟีเจอร์ Multi-Field Directives query ด้านล่างนี้สามารถแปลค่าทั้งหมดของทั้งฟิลด์ content และ excerpt ได้เช่นกัน แต่ส่งคำขอไปยัง Google Translate API เพียงครั้งเดียวเท่านั้น:
query {
posts {
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1]
)
}
}ฟังก์ชันการทำงานที่ขยายเพิ่มเติม
Directive ที่รับฟิลด์เพิ่มเติมสามารถให้การคำนวณเพิ่มเติมได้
ตัวอย่างเช่น directive @export โดยปกติจะ export ค่าของฟิลด์เดียว เช่น ชื่อของผู้ใช้ที่ล็อกอินอยู่:
query GetLoggedInUserName {
me {
name @export(as: "userName")
}
}ผ่านอาร์กิวเมนต์ affectAdditionalFieldsUnderPos นั้น @export สามารถรับหลายฟิลด์ และจะ export dictionary ที่ประกอบด้วยฟิลด์เหล่านั้นเป็น entry:
query GetLoggedInUserNameAndSurname {
me {
name
surname
@export(
as: "userProps"
affectAdditionalFieldsUnderPos: [1]
)
}
}@export จะสร้างค่าต่อไปนี้ในตัวแปร $userProps:
{
"name": "Leo",
"surname": "Loso"
}การตั้งค่า
หากต้องการเปิดหรือปิดการใช้งาน multi-field directives ใน GraphQL schema ให้ไปที่โมดูล "Multi-Field Directives" ในหน้า Settings และทำเครื่องหมายหรือยกเลิกเครื่องหมายที่ช่องทำเครื่องหมาย Enable multi-field directives?:

หากต้องการเปิดหรือปิดการใช้งาน multi-field directives บน endpoint เฉพาะ ให้เลือกตัวเลือกที่ต้องการในบล็อก "Multi-Field Directives" จาก Schema Configuration ที่เกี่ยวข้อง:
