Reuse or clone query()
Typically, we need to query multiple time from a filtered query. So, most of the time we use query()
method,
let's write a query for getting today created active and inactive products
$query = Product::query();
$today = request()->q_date ?? today();
if($today){
$query->where('created_at', $today);
}
// lets get active and inactive products
$active_products = $query->where('status', 1)->get(); // this line modified the $query object variable
$inactive_products = $query->where('status', 0)->get(); // so here we will not find any inactive products
But, after getting $active products
the$query
will be modified. So, $inactive_products
will not find any inactive products from $query
and that will return blank collection every time. Cause, that will try to find inactive products from $active_products
($query
will return active products only).
For solve this issue, we can query multiple time by reusing this $query
object. So, We need to clone this $query
before doing any $query
modification action.
$active_products = (clone $query)->where('status', 1)->get();
// it will not modify the $query
$inactive_products = (clone $query)->where('status', 0)->get();
// so we will get inactive products from $query
No comments:
Post a Comment