Laravel Tip : Custom Many To Many

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 

Bài Viết Liên Quan

Messsage

Nếu bạn thích chia sẻ của tôi, đừng quên nhấn nút !ĐĂNG KÝ