Enhancing Laravel Eloquent Queries with withSum() and withCount()

    Bài viết này mình sẽ giới thiệu các bạn cách sử dụng withSum() and withCount() với laravel relationship eloquent.
Để demo ví dụ mình sẽ tạo 2 tables là Category và Product và tạo relationship cho chúng.
Bạn có thể sử dụng withSum() & withCount() với laravel 6, laravel 7 & laravel 8 version.
Hãy xem ví dụ bên dưới nhé:

Category Model:

<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class Category extends Model
{
    use HasFactory;

    /**
     * Get the products.
     */
    public function products()
    {
        return $this->hasMany(Product::class);
    }
}

Product Model:

<?php
  
namespace App\Models;
 
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class Product extends Model
{
    use HasFactory;
  
    protected $fillable = [
        'name', 'price'
    ];
}

Ví dụ withSum() :

<?php
  
namespace App\Http\Controllers;
  
use App\Models\Category;
  
class SignaturePadController extends Controller
{
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function index()
    {
        $categories = Category::select("id", "name")
                        ->withSum('products', 'price')
                        ->get()
                        ->toArray();
 
        dd($categories);
    }
}

    Output:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Mobile
            [products_sum_price] => 330
        )
    [1] => Array
        (
            [id] => 2
            [name] => Laptop
            [products_sum_price] => 410
        )
)

sử dụng conditions trong withSum():

<?php
  
namespace App\Http\Controllers;
  
use App\Models\Category;
  
class SignaturePadController extends Controller
{
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function index()
    {
        $categories = Category::select("id", "name")
                        ->withSum(['products' => function($query) {
                                  $query->where('publish', 1);
		                }], 'price')
                        ->get()
                        ->toArray();
 
        dd($categories);
    }
}

    Mình đã thêm điều kiện trong hàm withsum ở trên chỉ những thằng có publish =1 thì mới tính tổng

Ví dụ withCount():

<?php
  
namespace App\Http\Controllers;
  
use App\Models\Category;
  
class SignaturePadController extends Controller
{
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function index()
    {
        $categories = Category::select("id", "name")
                        ->withCount('products')
                        ->get()
                        ->toArray();
 
        dd($categories);
    }
}

    Output:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Mobile
            [products_count] => 3
        )
    [1] => Array
        (
            [id] => 2
            [name] => Laptop
            [products_count] => 2
        )
)

    Mình hy vọng bài viết này sẽ giúp ích cho các bạn!
Tham khảo: https://www.itsolutionstuff.com

Nguồn: Viblo

Bình luận
Vui lòng đăng nhập để bình luận
Một số bài viết liên quan