Mối quan hệ `morphtomany` ở Laravel được sử dụng để xác định các mối quan hệ đa hình nhiều đến nhiều, trong đó nhiều mô hình có thể chia sẻ mối quan hệ với một loại mô hình duy nhất thông qua bảng trung gian đa hình. Điều này cho phép sự liên kết linh hoạt của nhiều mô hình khác nhau với một mô hình chung mà không cần các bảng trục riêng biệt cho mỗi cặp mô hình.
Các trường hợp sử dụng phổ biến cho `morphtomany` trong laravel
** 1. Hệ thống gắn thẻ
Một trong những trường hợp sử dụng phổ biến nhất là triển khai một hệ thống gắn thẻ trong đó nhiều mô hình khác nhau (ví dụ: bài đăng, video, trang) có thể được gắn thẻ với cùng một thẻ. Thay vì có các bảng trục riêng biệt cho mỗi mối quan hệ thẻ mô hình, `morphtomany` cho phép tất cả các thẻ được lưu trữ trong một bảng` tags` duy nhất và liên quan đến đa hình với bất kỳ mô hình nào.
Ví dụ, cả hai mô hình `post` và` video` đều có thể có phương thức `tags ()` sử dụng `morphtomany` để truy xuất các thẻ và mô hình` tag` có thể sử dụng `morphedbymany` để có được tất cả các bài đăng hoặc video được gắn thẻ với nó [1] [5] [9].
** 2. Phân loại các loại nội dung khác nhau
Tương tự như thẻ, các danh mục có thể được chia sẻ trên các loại nội dung khác nhau. Ví dụ, cả bài viết và sản phẩm có thể cần được phân loại và mối quan hệ nhiều hình dạng đa hình cho phép họ chia sẻ các danh mục mà không cần bảng dự phòng.
** 3. Gán nhãn hoặc thuộc tính cho nhiều mô hình
Nếu bạn có nhãn, thuộc tính hoặc tính năng có thể áp dụng cho các mô hình khác nhau (ví dụ: người dùng, đơn đặt hàng, sản phẩm), sử dụng `morphtomany` cho phép bạn liên kết các nhãn này một cách linh hoạt với bất kỳ loại mô hình nào.
** 4. Vai trò người dùng hoặc quyền trên nhiều loại người dùng
Trong các ứng dụng có nhiều loại người dùng (ví dụ: quản trị viên, khách hàng, nhà cung cấp), vai trò hoặc quyền có thể được chỉ định bằng cách sử dụng đa hình `morphtomany` để vai trò được quản lý trong một bảng duy nhất nhưng liên quan đến các mô hình người dùng khác nhau [1].
** 5. Liên kết nhận xét hoặc đính kèm với nhiều mô hình theo kiểu nhiều
Mặc dù các bình luận thường là đa hình một-nhiều, nhưng có thể có các kịch bản trong đó nhiều bình luận hoặc tệp đính kèm liên quan đến nhiều mô hình theo cách nhiều đến nhiều. `morphtomany` có thể được sử dụng để mô hình hóa các mối quan hệ như vậy.
Làm thế nào `morphtomany` hoạt động
- Nó sử dụng một bảng trục duy nhất, ví dụ: `taggables`, với các cột cho` tag_id`, `taggable_id` và` taggable_type`.
- Các cột `taggable_id` và` taggable_type` cho phép Laravel xác định mô hình nào thẻ được liên kết với.
- Trên các mô hình liên quan (ví dụ: `post`,` video`), bạn xác định một phương thức trả về `$ this-> morphtomany (TAG :: class, 'taggable').
- Trên mô hình `tag`, bạn xác định các mối quan hệ nghịch đảo bằng cách sử dụng` morphedbymany` để truy xuất tất cả các mô hình của một loại đã cho liên quan đến thẻ đó [1] [5].
Bản tóm tắt
`morphtomany` là lý tưởng khi bạn muốn liên kết nhiều mô hình với một mô hình chung theo kiểu đa hình nhiều đến nhiều. Nó được sử dụng rộng rãi cho các hệ thống gắn thẻ, phân loại, gán vai trò trên nhiều loại người dùng và bất kỳ kịch bản nào trong đó nhiều mô hình khác nhau chia sẻ một tập hợp các mô hình liên quan chung mà không cần bảng trục riêng cho mỗi cặp.
Cách tiếp cận này đơn giản hóa thiết kế cơ sở dữ liệu và bảo trì mã bằng cách tập trung các mối quan hệ nhiều đến đa hình thành một cấu trúc thanh lịch duy nhất.
Trích dẫn:
[1] https:
[2] https://laraveldaily.com/post/polymorphic-relations-laravel-open-source-examples
[3] https://stackoverflow.com/questions/57522923/how-to-use-morphtomany
[4] https://stackoverflow.com/questions/43285779/laravel-polymorphic-relations-has-many-through
[5] https://laravel.com/docs/11.x/eloquent-relationships
[6] https://www.linkedin.com/pulse/complete-guide-polymorphic-relationships-morphs-sajith-madhubashana-rk1xc
[7] https://joedixon.co.uk/a-practical-use-case-for-laravels-polymorphic-relationships
[8] https://stackoverflow.com/questions/58811999/what-are-the-uses-of-morphs-column-type-in-laravel
[9] https://laraveldaily.com/post/laravel-polymorphic-many-to-many-get-all-related-records