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
model, define the relationship with the Sharedata
model. For example:Order
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…