การกำหนดค่า Schema
การกำหนดค่า Schemaการใช้งาน Multi-Field Directives

การใช้งาน 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 <= ใช้งานโดยปริยาย เสมอ

กรณีการใช้งาน

ฟีเจอร์นี้มีกรณีการใช้งานหลักสองประการ:

  1. ประสิทธิภาพ
  2. ฟังก์ชันการทำงานที่ขยายเพิ่มเติม

ประสิทธิภาพ

สำหรับ 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
การตั้งค่าสำหรับ Multi-Field Directives

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

Multi-Field Directives ใน Schema Configuration
Multi-Field Directives ใน Schema Configuration