Chúng ta có thể custom cách thức truy vấn mối quan hệ (Many-to-Many) trong Laravel. Thông thường chúng ta hay sử dụng cách thức mặt định như sau:
// Product Model
public function user(): BelongsToMany
{
return $this->belongsToMany(User::class,'product_user');
}
Và sử dụng cách thể thêm một dữ liệu vào
// thêm,edit một product của user
$product->user()->attach($user,['type'=>'author'])
$product->user()->attach($user,['type'=>'editor'])
// lấy những sản phẩm của user thuộc type='author', or ytpe='editor'
$product->users()->wherePivot('type',author')->get()
$product->users()->wherePivot('type','editor')->get()
Bây giờ chúng ta sẽ custom lại một xíu như sau:
// Product Model
public function authors(): BelongsToMany
{
return $this->belongsToMany(User::class,'product_user')->withPivotValue('type','author');
}
public function editors(): BelongsToMany
{
return $this->belongsToMany(User::class,'product_user')->withPivotValue('type','editor');
}
Bây giờ bạn sẽ thấy điều tuyệt với hơn với cú pháp thêm như sau
// thêm sản phẩm của tác giả nào đó
$product->authors()->attach($user)
//lấy tác giả của sản phẩm đó ra
$product->authors;
// tác giả đã chỉnh sửa sản phẩm
$product->editors()->attach($user);
// lấy tác giả chỉnh sửa sản phẩm đó
$product->editors;
Okay, nếu chúng ta thêm nhiều nhiều tác giả cho một sản phẩm thì sau
// Thêm nhiều tác giả cùng lúc
$authorIds = [2, 3, 4]; // Giả sử đây là ID của các tác giả
$product->authors()->attach($authorIds);
Hoặc bạn muốn lấy thông tin "author, editor" của sản phấm đó
$product = Product::find(1);
$authors = $product->authors; // Lấy tất cả tác giả của sản phẩm
$editors = $product->editors; // Lấy tất cả biên tập viên của sản phẩm
Okay mọi người hãy thử cách trên thử xem