условия в энергичной загрузке в красноречивом

Я получаю свой продукт в виде этого кода. Я использую метод () для загрузки отношения вариаций.
У меня есть несколько фильтров для этого. Но если каких-либо изменений не существует, я получаю продукт.

Как я могу получить только этот продукт, где существуют варианты?

$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);

0

Решение

Чтобы сделать это, вы должны сделать то же самое снова, но с whereHas, Поскольку замыкание будет точно таким же, мы можем поместить его в переменную, чтобы избежать дублирования кода:

$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);

(Кстати, возвращать не нужно $query в конце анонимная функция)

редактировать

Как мы выяснили, вам нужно изменить groupBy заявления к 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
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]