Reputation: 1370
I get my Product be this code. I use with() method to load variations relation. I have some filters for it. But if any variations does't exist I get Product.
How can I get only this Product where variations exist ?
$query = Product::with(array(
'variations' => function($query) use($filters){
if(isset($filters['price_start']) && !empty($filters['price_start'])){
$query->groupBy('id')->having(DB::raw('SUM(price_base + price_engraving)'), '>=', $filters['price_start']);
}
if(isset($filters['price_end']) && !empty($filters['price_end'])){
$query->groupBy('id')->having(DB::raw('SUM(price_base + price_engraving)'), '<=', $filters['price_end']);
}
if(isset($filters['q_magazine_start']) && !empty($filters['q_magazine_start'])){
$query->where('q_magazine', '>', $filters['q_magazine_start']);
}
if(isset($filters['q_magazine_end']) && !empty($filters['q_magazine_end'])){
$query->where('q_magazine', '<', $filters['q_magazine_end']);
}
return $query;
}
))->whereIn('id', $productList);
Upvotes: 0
Views: 580
Reputation: 153140
To accomplish that you have to do pretty much the same thing again but with whereHas
. Since the closure will be exactly the same we can put it in a variable to avoid duplicate code:
$filterClosure = function($query) use ($filters){
if(isset($filters['price_start']) && !empty($filters['price_start'])){
$query->groupBy('id')->having(DB::raw('SUM(price_base + price_engraving)'), '>=', $filters['price_start']);
}
if(isset($filters['price_end']) && !empty($filters['price_end'])){
$query->groupBy('id')->having(DB::raw('SUM(price_base + price_engraving)'), '<=', $filters['price_end']);
}
if(isset($filters['q_magazine_start']) && !empty($filters['q_magazine_start'])){
$query->where('q_magazine', '>', $filters['q_magazine_start']);
}
if(isset($filters['q_magazine_end']) && !empty($filters['q_magazine_end'])){
$query->where('q_magazine', '<', $filters['q_magazine_end']);
}
};
$query = Product::with(array('variations' => $filterClosure))
->whereHas('variations', $filterClosure)
->whereIn('id', $productList);
(By the way, there's no need to return $query
at the end of the anonymous function)
As we figured out you need to change the groupBy
statements to where
$filterClosure = function($query) use ($filters){
if(isset($filters['price_start']) && !empty($filters['price_start'])){
$query->where(DB::raw('price_base + price_engraving'), '>=', $filters['price_start']);
}
if(isset($filters['price_end']) && !empty($filters['price_end'])){
$query->where(DB::raw('price_base + price_engraving'), '<=', $filters['price_end']);
}
// same code as above
};
Upvotes: 1