ฟังก์ชัน 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 รูปแบบ คือ
'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)- One-to-One : เช่น ตาราง user เชื่อมกับตาราง profile คือ 1 user ก็มีได้ 1 profile เท่านั้น
- One-to-Many : เช่น ตาราง user เชื่อมกับ ตาราง post คือ 1 user จะสามารถมีได้มากกว่า 1 post
- Many-to-Many : เช่น ตาราง category กับตาราง post คือ 1 category ก็สามารถมีได้ในหลาย post และ 1 post ก็มีได้มากกว่า 1 category
ในการเชื่อมความสัมพันธ์ ใน Active Record จะแบ่งออกเป็น 4 ประเภท คือ
- BELONGS_TO : ถ้าความสัมพันธ์ระหว่างตาราง A และ B เป็น แบบ One-to-Many ฉะนั้น B belongs to A (เช่น Post belongs to User) เป็นการบอกว่า field ของ model นี้จะชี้ไปที่ primary key ของอีก model นึง
- HAS_MANY : ถ้าความสัมพันธ์ระหว่างตาราง A และ B เป็น แบบ One-to-Many ฉะนั้น A has many B เช่น User has many Post
- 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
(ดูเพิ่มเติมได้ที่นี่) - MANY_MANY : DBMS ส่วนใหญ่จะไม่มีการเรียกใช้ได้โดยตรง อาจใช้วิธีการ break ความสัมพันธ์ออกเป็น One-to-Many แทน เช่น ตาราง Category กับ Post เราสามารถแบ่งความสัมพันธ์ MANY_MANY ได้ โดยเป็นการรวมกันของ BELONGS_TO กับ HAS_MANY. แต่ในกรณีของ Yii สามารถเรียกใช้ได้เลย
รูปแบบการใช้งาน คือ
อธิบาย
- 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 ความคิดเห็น:
แสดงความคิดเห็น