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