Я пытаюсь написать систему фильтров, используя laravel, вот такая ситуация:
Вот мой массив $inputs
.Цвета - это флажки, а материал - выпадающий список:
$inputs = [
'colors' => ['green' => 'green', 'red' => 'red'],
'material' => 'wood',
]
Вот таблица (variants_values
), на которую я смотрю.Здесь я храню все комбинации свойств для моих вариантов:
id | product_id | variant_id | property_id | label | value
550 91 213 1 color green
551 91 213 2 material wood
552 91 214 1 color red
552 91 214 2 material plastic
Вот мой запрос.Цель состоит в том, чтобы вернуть соответствующие продукты, поэтому я использую метод whereHas()
для создания подзапроса над моим variants_values
:
foreach($inputs as $key => $input) {
$products->whereHas('variants_values', function($query) use($key, $input) {
if(is_array($input)) {
$query->where('label', $key)->whereIn('value', $input);
} elseif(!empty($input)) {
$query->where('label', $key)->where('value', $input);
}
});
}
Этот код работает довольно хорошо, за исключением одной ситуации:
- Если я проверю
green
цвет и wood
материал, я хочу, чтобы мой продукт 91
был возвращен, как это.
НО
- Если я проверяю
red
цвет и wood
материал, я не хочу результатов, потому что вариант red
сделан из plastic
, а не wood
.
На самом деле, продукт 91
по-прежнему возвращается, потому что на самом деле мой код не проверяет, соответствует ли он тому же варианту, что и $inputs
;
Так что мне нужно что-то в моем коде, которое скажет:
foreach($inputs as $key => $input) {
$products->whereHas('variants_values', function($query) use($key, $input) {
if(is_array($input)) {
$query->where('label', $key)->whereIn('value', $input);
} elseif(!empty($input)) {
$query->where('label', $key)->where('value', $input);
}
##
$query->where('Verify that the variant ID is the same or something like that');
##
});
}
Я знаю, что не далеко от решения, но я застрял здесь на самом деле.
Спасибо за вашу помощь