Я делаю функцию фильтра для продуктов.У меня есть 2 модели: Product
и Attribute
(отношение BelongsToMany)
Таблица атрибутов:
id name
-------------
1 RAM
2 HDD
Таблица продуктов:
id name
-----------------
1 Product 1
2 Product 2
3 Product 3
4 Product 4
И сводная таблицавыглядят так:
id attribute_id product_id value
----------------------------------------------------
1 1 (RAM) 1 8GB
2 2 (HDD) 1 256GB
3 1 (RAM) 2 8GB
4 2 (HDD) 2 256GB
5 1 (RAM) 3 4GB
6 2 (HDD) 4 512GB
При фильтрации продуктов пользователь выбирает RAM => [4GB, 8GB]
и HDD => 256GB
.
Я хочу получить продукты, которые имеют RAM - 4GB
ИЛИ RAM - 8GB
И HDD - 256GB
.Это означает, что продукт имеет атрибуты RAM - 4GB, HDD - 256GB
И RAM - 8GB, HDD - 256GB
. Фильтры будут удовлетворены.По сравнению с моей базой данных, приведенной выше, я получу продукты с идентификаторами 1 и 2 (продукт 3 имеет RAM 4GB
, но не имеет HDD 256
, поэтому не считается).
Вот мой код, ноэто не работает, как я ожидал.
$products = Product::whereHas('attributes', function ($query) {
$query->whereIn('attribute_id', [1, 2]);
$query->whereIn('value', ['4GB', '8GB', '256GB']);
})->get();
или
$products = Product::whereHas('attributes', function ($query) {
$query->where(function ($query) {
$query->where('attribute_id', 1)
->whereIn('value', ['4GB', '8GB']);
})->orWhere(function ($query) {
$query->where('attribute_id', 2)
->whereIn('value', ['256GB']);
});
})->get();