Sau đây mình sẽ giới thiệu mọi người sử dụng pivot table để thao tác với các bảng trung gian trong mối quan hệ nhiều - nhiều ( many-to-many relationship ).
1. Tạo bảng.
Chúng ta sẽ có 3 bảng như sau :
Phần này thì quá quen thuộc với mọi người rồi nên mình xin phép bỏ qua 🙂)))
Còn dưới đây là 1 số lưu ý nhỏ khi đặt tên bảng trung gian.
- Tên của pivot table bao gồm tên của 2 bảng chính (ở dạng số ít đó là product và store)
ngăn cách nhau bởi dấu gạch dưới (underscore product_store)
- Sắp xếp theo thứ tự bảng chữ cái (alphabetical: p đứng trước s nên phải là product_store).
- 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à store_id
2. Tạo model.
- Chúng ta sẽ chẳng cần tạo thêm một model là product_store làm gì cả , thay vào đó ta chỉ cần viết mới quan hệ giữa 2 bảng products vs stores là được ( tất nhiên là sẽ dùng 'belongsToMany' rồi).
public function product()
{
return $this->belongsToMany(Product::class, 'product_store', 'product_id', 'store_id');
}
nếu bảng trung gian có thêm cột khác mà mình cần dùng thì chỉ cần thêm " ->withPivot(' ') "
3. Thao tác
3.1 attach() - thêm.
- Giả sử Store của bạn có id là $storeId muốn thêm một sản phẩm có id là $productId chúng ta làm như sau:
$store = Store::find($storeId);
$store->products()->attach($productId);
- thêm nhiều sản phẩm thì ta chỉ cần cho tất cả productId vào 1 mảng.
$store->products()->attach([
$productId1,
$productId2,
$productId3
]);
- với trường hợp bảng trung gian có thêm các cột khác
$store->products()->attach($productId, [
'a' => 'value',
'b' => 'value',
'c' => 'value',
]);
3.2 detach() - xóa
- Nếu xóa product thì ta chỉ cần thay attach thành detach là xong .
3.3 sync() - đồng bộ
- còn đây là sự kết hợp giữa attach vs detach. Khi truyền vào tham số hoặc mảng 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.
ví dự store đang có 2 product với id là 1 và 2 thì khi sync.
$store->products()->sync([2, 3]);
tương đương với
$store->products()->attach([3]);
$store->products()->detach([1]);
Trên đây là 1 số phần mà mình hay sử dụng, ngoài ra nó còn có nhiều phần khác , mọi người có thể tham khảo thêm trên google . Cám ơn mọi người đã xem bài viết của mình.