ความแตกต่างระหว่าง `morphtomany` และ` morphedbymany 'ใน Laravel polymorphic ความสัมพันธ์หลายต่อหลายคนอยู่ในบทบาทของพวกเขาในความสัมพันธ์และวิธีการที่โครงสร้างฐานข้อมูลสนับสนุนพวกเขา
โครงสร้างฐานข้อมูลใน polymorphic หลายต่อหลายคน
ความสัมพันธ์แบบ polymorphic หลายต่อหลายคนเกี่ยวข้องกับสองตารางหลัก:
- สองตารางรุ่น (เช่น `โพสต์ 'และ` แท็ก')
- ตารางเดือยกลางหนึ่งตาราง (เช่น `taggables`)
ตารางเดือยมีอย่างน้อยสามคอลัมน์:
- `tag_id` (รหัสของโมเดลที่เกี่ยวข้องเช่นแท็ก)
- `taggable_id` (รหัสของโมเดลที่เกี่ยวข้องกับแท็กเช่นโพสต์หรือวิดีโอ)
- `taggable_type` (ชื่อคลาสหรือประเภทของโมเดลที่เกี่ยวข้องเช่น` app \ models \ post` หรือ `app \ models \ video ')
โครงสร้างนี้อนุญาตให้ตารางเดือยเดี่ยวเชื่อมโยงหลายรุ่นที่แตกต่างกับโมเดลทั่วไป (แท็กในกรณีนี้) โดยไม่ต้องใช้ตารางเดือยแยกต่างหากสำหรับการรวมกันของแต่ละรุ่น [5] [9]
บทบาทของ `morphtomany '
- ใช้กับแบบจำลองที่ "เป็นเจ้าของ" หรือ "มี" ความสัมพันธ์แบบ polymorphic
- กำหนดความสัมพันธ์จากมุมมองของแบบจำลองที่เกี่ยวข้องกับรุ่นอื่น ๆ อีกมากมาย
- ตัวอย่างเช่นในโมเดล `post`, method` tags () `ใช้` morphtomany 'เพื่อให้ได้แท็กทั้งหมดที่เกี่ยวข้องกับโพสต์นั้น
- วิธีนี้ระบุโมเดลที่เกี่ยวข้องและ "ชื่อ morph" (เช่น `'taggable'`) ซึ่งสอดคล้องกับคอลัมน์ตาราง pivot (` taggable_id` และ `taggable_type`)
- ค้นหาการกรองตารางเดือยโดย ID ของรุ่นปัจจุบันและพิมพ์เพื่อค้นหารุ่นที่เกี่ยวข้อง [5] [9]
บทบาทของ `morphedbymany '
- ใช้กับโมเดลที่เป็นเป้าหมายของความสัมพันธ์แบบ polymorphic
-กำหนดด้านผกผันของความสัมพันธ์แบบหลายต่อหลาย polymorphic
- ตัวอย่างเช่นในโมเดล `tag` วิธีการเช่น` posts () `หรือ` videos () `ใช้` morphedbymany 'เพื่อรับโพสต์หรือวิดีโอทั้งหมดที่เกี่ยวข้องกับแท็กนั้น
- มันระบุคลาสโมเดลที่เกี่ยวข้องและชื่อ morph เดียวกันที่ใช้ใน `morphtomany '
- วิธีการนี้สอบถามการกรองตารางเดือยตามประเภทและ ID ของรุ่นที่เกี่ยวข้องเพื่อค้นหาทุกรุ่นของประเภทนั้นที่เกี่ยวข้องกับรุ่นปัจจุบัน (TAG) [5] [9]
สรุปความแตกต่างในข้อกำหนดฐานข้อมูล
- `morphtomany` ถูกเรียกใช้โมเดลที่เกี่ยวข้องกับคนอื่น ๆ และใช้คอลัมน์ตารางเดือย` taggable_id` และ `taggable_type` เพื่อกรองบันทึกที่` taggable_type` ตรงกับคลาสโมเดลปัจจุบัน
- `morphedbymany` ถูกเรียกใช้ในโมเดลที่เกี่ยวข้องกับ (ผกผัน) และใช้ตารางเดือยเพื่อค้นหาทุกรุ่นที่เฉพาะเจาะจงที่เกี่ยวข้องกับโมเดลปัจจุบัน
ทั้งสองวิธีใช้ตารางเดือยเดียวกัน แต่แตกต่างกันไปตามทิศทางของความสัมพันธ์ที่เป็นตัวแทน ตาราง Pivot ยังคงเหมือนเดิมโดยมีคอลัมน์สำหรับ ID และประเภทของรุ่นที่เกี่ยวข้องทำให้สามารถเชื่อมโยงแบบหลายประเภทได้หลายประเภทผ่านตารางเดียว
ในสาระสำคัญ `morphtomany` กำหนดความสัมพันธ์จากด้าน" ผู้ปกครอง "หรือ" เป็นเจ้าของ "ด้านโมเดลในขณะที่` morphedbymany` กำหนดความสัมพันธ์แบบผกผันจากด้านโมเดล "ที่เกี่ยวข้อง" ทั้งคู่อาศัยโครงสร้างตาราง polymorphic pivot เดียวกัน [5] [9] [1]
การอ้างอิง:
[1] https://laracasts.com/discuss/channels/laravel/difference-between-standard-polymorphic-many-to-many-polymorphic
[2] https://www.sitepoint.com/eloquents-polymorphic-relationships-explained/
[3] https://laraveldaily.com/post/laravel-polymorphic-many-to-many-get-all-rorated-records
[4] https://laracasts.com/discuss/channels/eloquent/polymorphic-many-to-many-relation-to-multiple-models
[5] https://laravel.com/docs/11.x/eloquent-relationships
[6] https://docs.octobercms.com/3.x/extend/database/relations.html
[7] https://simple-code.agency/blog/development/simplifying-many-to-many-relationships-with-laravel-polymorphic-relations
[8] https://stackoverflow.com/Question
[9] https://blog.logrocket.com/polymorphic-relationships-laravel/