😅Pivot tables và mối quan hệ nhiều-nhiều (many-to-many relationship) trong Laravel full (ok)
https://chungnguyen.xyz/posts/pivot-tables-va-moi-quan-he-nhieu-nhieu-many-to-many-relationship-trong-laravel
Tham khảo thêm: https://viblo.asia/p/pivot-tables-and-many-to-many-relationships-trong-laravel-DzVkpLjOknW
Ví dụ 1: 3.1 attach() - thêm
C:\xampp\htdocs\blog\routes\web.php
C:\xampp\htdocs\blog\app\Shop.php
C:\xampp\htdocs\blog\app\Product.php
Ví dụ 2: 3.2 detach() - xóa
Kết quả là trong bảng Pivot: product_shop có thêm 1 row mới chứa giá trị $shopId và $productId.
Ngược lại muốn attach Product và Shop ta làm ngược lại:
Ví dụ 3: sync() - đồng bộ
3.4 Toggle - Bật tắt
Pivot tables và mối quan hệ nhiều-nhiều (many-to-many relationship) trong Laravel
Chung Nguyễn 1 năm trước 9088 4 Bình luận Laravel Relationship Many-To-Many
Hôm nay chúng ta cùng tìm hiểu về Eloquent trong Laravel với mối quan hệ nhiều - nhiều (many to many relationship). Thoạt đầu, có thể sẽ hơi lạ và khó định nghĩa cụm từ pivot tables nhưng tính năng này rất hữu dụng trong việc build many-to-many relationship với Laravel framework. Pivot tables về cơ bản là một bảng trung gian giữa 2 bảng chính (main tables). Chúng ta sẽ cùng tìm hiểu cụ thể ở ví dụ thực tế dưới đây.
1. Ví dụ thực tế về bảng Pivot
Trên thực tế có rất nhiều ví dụ về mối quan hệ nhiều-nhiều, một người dùng (User) có nhiều vai trò (Role) và một role được gắn bởi nhiều user, một người lái xe (Drive) thì có thể lái nhiều chiếc xe (Car), và một chiếc xe được lái bởi nhiều người, hay như một cửa hàng (Shop) bán nhiều sản phẩm (Product) và một sản phẩm thì được bán ở nhiều cửa hàng... và còn vô vàn những ví dụ nữa.
Mình sẽ lấy ví dụ Shop - Product làm ví dụ trong bài viết này nhé. Chúng ta sẽ phát thảo sơ qua database như thế này:
Bảng: shops
– id
– name
Bảng: products
– id
– name
Bảng: product_shop
– product_id
– shop_id
Bảng cuối cùng trong danh sách product_shop chính là bảng Pivot. Bảng pivot là bảng nối giữa 2 bảng, đúng như tên gọi "trục xoay" của nó.
Vậy bảng Pivot cần phải tuân thủ 1 số nguyên tắc sau đây, các bạn lưu ý khi thiết kế cơ sở dữ liệu (csdl) nhé:
Tên của pivot table bao gồm tên của 2 bảng chính (ở dạng số ít đó là shop và product)
Ngăn cách nhau bởi dấu gạch dưới (underscore product_shop)
Sắp xếp theo thứ tự bảng chữ cái (alphabetical: p đứng trước s nên phải là product_shop).
Phải chứa 2 cột là khóa ngoại của 2 bảng tham chiếu theo công thức tên bảng tham chiếu số ít + "_id" cho nên ta có: product_id và shop_id
2. Tạo migration
2.1. Tạo migration cho Shop model
Chúng ta sẽ có 2 file app\Shop.php
và database\migrations\2018_08_22_194022_create_shops_table.php
app\Shop.php
database\migrations\2018_08_22_194022_create_shops_table.php
2.2. Tạo migration cho Product model
Chúng ta sẽ có 2 file app\Product.php
và database\migrations\2018_08_22_194151_create_products_table.php
app\Product.php
database\migrations\2018_08_22_194151_create_products_table.php
2.3. Tạo migration bảng Pivot: product_shop
Chạy command:
database\migrations\2018_08_22_195123_create_product_shop_table.php
3. Thao tác với cơ sở dữ liệu
3.1 attach() - thêm
Giả sử Shop của bạn có id là $shopId muốn thêm một sản phẩm có id là $productId chúng ta làm như sau:
Kết quả là trong bảng Pivot: product_shop có thêm 1 row mới chứa giá trị $shopId và $productId.
Ngược lại muốn attach Product và Shop ta làm ngược lại:
Cũng giả sử như trên nhưng thay vì muốn thêm 1 sản phẩm, ta muốn thêm nhiều sản phẩm có id là $productId1, $productId2, $productId3 thì đơn giản như sau:
Nếu bảng Pivot ngoài product_id và shop_id mà bạn còn thêm trường a, b, c mà bạn muốn thêm thông tin cho trường đó thì đơn giản như sau:
3.2 detach() - xóa
Ngược lại với attach, detach cũng hỗ trợ xóa 1 hoặc nhiều records trong bảng Pivot (product_shop).
3.3 sync() - đồng bộ
Sync là sự kết hợp giữa attch và detach ở trên. Khi truyền vào tham số là $productId, hoặc mảng tham số [$productId1, $productId2, $productId3] thì sync sẽ kiểm tra, cái nào không có sẽ loại bỏ, cái nào đang có thì giữ nguyên và cái nào mới thì thêm vào.
Giả sử hiện tại Shop có $id là 1 hiện đang liên kết với các Product có $id là 1 và 2
id
product_id
shop_id
1
1
1
2
2
1
Bây giờ ta muốn Shop có $id là 1 chỉ bán Product có $id là 2 và 3 ta làm như sau:
Khi bạn muốn sync nhưng kiểm tra có mới thì thêm vào, còn không có thì cũng đừng có xóa đi thì làm như sau:
3.4 Toggle - Bật tắt
Giống như công tắc, đang bật thì tắt mà đang tắt thì bật. Vậy thì nếu đã attach rồi thì detach và ngược lại.
Giả sử giống như ở trên: hiện tại Shop có $id là 1 hiện đang liên kết với các Product có $id là 1 và 2
Cảm ơn bạn đã đọc hết bài viết này =))
Theo dõi Chung Nguyễn Blog
Các bài viết trên website thường xuyên được đăng tải và cập nhật trên trang Facebook Chung Nguyễn Blog nếu thường xuyên đọc bài trên website hay chỉ đơn giản là mến mộ sự đẹp trai thanh lịch của chàng trai coder tuổi trăng tròn đôi mươi thì hãy tặng cho Chung một LIKE trên trang Facebook Chung Nguyễn Blog nhé! Mãi yêu các bạn!
Last updated