Laravel withCount() with Where Condition Example

Posted by

In this tutorial, we will explore how to use the withCount() method in Laravel with a where condition. We will cover the step-by-step process of creating a relationship between models and applying withCount() with a condition.

Let’s consider an example involving two models: Sharedata and Order. We’ll demonstrate how to establish a relationship between them and retrieve the count of related products with a specific condition.

To get started, follow these steps:

Step 1: Define the Relationship In your Sharedata model, define the relationship with the Order model. For example:

sharedata Model:

<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class Sharedata extends Model
{
    use HasFactory;
  
    /**
     * Get the comments for the blog post.
     */
    public function orders()
    {
        return $this->hasMany(Order::class);
    }
}

Order Model:

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

withCount() Example:

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

Output:

Array

(

    [0] => Array

        (

            [id] => 1

            [name] => Mobile

            [orders_count] => 3

        )

    [1] => Array

        (

            [id] => 2

            [name] => Laptop

            [orders_count] => 2

        )

)

withCount() with Where Condition Example:

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

Output:

Array

(

    [0] => Array

        (

            [id] => 1

            [name] => Pendrive

            [active_orders_count] => 2

        )

    [1] => Array

        (

            [id] => 2

            [name] => Laptop

            [active_orders_count] => 2

        )

)

I hope it can help you…

Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x