ฟังก์ชัน relations() ใน model

Function ที่ชื่อ relations() ใน Model ทำหน้าที่อะไร


  • ฟังก์ชัน relations() จะถูกแก้ไขบ่อยๆ เมื่อเราได้ Generate code จาก Gii แล้ว (เช่นเดียวกับ ฟังก์ชัน rule)
  • ก่อนที่จะกระทำการใดๆ กับการดึงข้อมูล (Query) จำเป็นต้องสร้างความสัมพันธ์ก่อน
  • เป็น method ที่ใช้เชื่อมความสัมพันธ์ของ object หรือตาราง เพื่อจะได้ไม่ต้องไปยุ่งยากกับ SQL JOIN statements ที่แสนจะสลับซับซ้อน
  • ยกตัวอย่างการ เชื่อมตาราง "author" กับตาราง "User" ด้วยความสัมพันธ์ แบบ one-to-one ใช้คำสั่ง...
'author' => array(self::BELONGS_TO, 'User', 'author_id'),
ความสัมพันธ์ทางด้านฐานข้อมูลมีอยู่ด้วยกัน 3 รูปแบบ คือ
  1. One-to-One : เช่น ตาราง user เชื่อมกับตาราง profile คือ 1 user ก็มีได้ 1 profile เท่านั้น
  2. One-to-Many : เช่น ตาราง user เชื่อมกับ ตาราง post คือ 1 user จะสามารถมีได้มากกว่า 1 post
  3. Many-to-Many : เช่น ตาราง category กับตาราง post คือ 1 category ก็สามารถมีได้ในหลาย post และ 1 post ก็มีได้มากกว่า 1 category
ในการเชื่อมความสัมพันธ์ ใน Active Record จะแบ่งออกเป็น 4 ประเภท คือ
  1. BELONGS_TO : ถ้าความสัมพันธ์ระหว่างตาราง A และ B เป็น แบบ One-to-Many ฉะนั้น B belongs to A (เช่น Post belongs to User) เป็นการบอกว่า field ของ model นี้จะชี้ไปที่ primary key ของอีก model นึง
  2. HAS_MANY : ถ้าความสัมพันธ์ระหว่างตาราง A และ B เป็น แบบ One-to-Many ฉะนั้น A has many B เช่น User has many Post
  3. HAS_ONE : เป็นการบอกว่า มี model อื่นที่ชี้เข้ามาที่ primary key ของ model นี้ (เช่น  User has at most one Profile)
          อธิบายง่ายๆ คือ
    CHILD table (มี foreign key) BELONGS_TO a PARENT table (ไม่มี foreign key) และ
    a PARENT table HAS_ONE CHILD table
    (ดูเพิ่มเติมได้ที่นี่)
  4. MANY_MANY :  DBMS ส่วนใหญ่จะไม่มีการเรียกใช้ได้โดยตรง อาจใช้วิธีการ break ความสัมพันธ์ออกเป็น One-to-Many แทน เช่น ตาราง Category กับ Post เราสามารถแบ่งความสัมพันธ์ MANY_MANY ได้ โดยเป็นการรวมกันของ BELONGS_TO กับ HAS_MANY. แต่ในกรณีของ Yii สามารถเรียกใช้ได้เลย
รูปแบบการใช้งาน คือ
'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)

อธิบาย
  • VarName คือ ชื่อของความสัมพันธ์ (Relational)
  • RelationType เป็นการระบุประเภทของความสัมพันธ์ ซึ่งมี 4 ตัวแปร คือ self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY และ self::MANY_MANY
  • ClassName คือ ชื่อของ Active Record (AR) class ที่เชื่อมโยง กับ AR นี้
  • ForeignKey คือ Foreign Key ของความสัมพันธ์

0 ความคิดเห็น:

แสดงความคิดเห็น