Laravel Tip : Custom Many To Many

Hòa Nguyễn Coder

Published in Web Developer · Đã đăng vào tháng 9 6, 2024 9:30 PM

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 

Nếu bạn thấy đem lại kiến thức bổ ích, hãy Click xem quảng cáo trên trang website của mình nhé! 🚀