В моей БД есть следующие таблицы:
TABLE_PRODUCTS
id
name
TABLE_VARIANTS
id
product_id
sku
TABLE_VARIANTS_PROPERTIES
id
variant_id
property_value_id
Я пытаюсь построить запрос для фильтрации продуктов. Допустим, я хочу показать только те продукты, которые имеют варианты с property_value_id = 1 и property_value_id = 2
Отношения: PRODUCTS -> hasMany -> VARIANTS -> hasMany -> VARIANTS_PROPERTIES.
Есть идеи?
UPDATE:
Я использовал ответ Александра Петерса. Вот мой код:
$query->whereHas('variants.properties.propertiesValues', function ($query) use ($variants) {
$query->whereIn('value', $variants);
});
Если говорить точнее, у меня есть еще одна таблица в моем запросе, которую я не указывал ранее. Этот запрос работает, но не так, как ожидалось. Что я хочу сделать, это:
Получить все товары, которые имеют PRODUCTS_VARIANTS, у которых есть PRODUCTS_VARIANTS_PROPERTIES, у которых PRODUCTS_PROPERTIES_VALUES в качестве активного фильтра (VARIANTS). Я знаю все варианты - для этого я использую декартово произведение.
Так, например, мне нужно получить все продукты, которые имеют варианты, которые имеют все значения из варианта в фильтре. Этот запрос работает, только если есть варианты только с 1 значением. Как я могу решить это? Я пытаюсь с foreach ($ варианты как ...), но не повезло. Все еще не работает на 100%, как ожидалось.
ТАБЛИЦА:
TABLE_PRODUCTS
id
name
TABLE_PRODUCTS_VARIANTS
id
product_id
sku
TABLE_PRODUCTS_VARIANTS_PROPERTIES
id
variant_id
property_value_id
TABLE_PRODUCTS_PROPERTIES_VALUES
id
value
Все возможные варианты из активного фильтра находятся во вложенном массиве, например, у меня есть активный фильтр с цветным ЧЕРНЫМ и КРАСНЫМ и размерным фильтром XS:
[
0 => [
0 => Black
1 => XS
]
1 => [
0 => Red
1 => XS
]
]
Мне нужно проверить значения из массива VARIANTS в последней таблице TABLE_PRODUCTS_PROPERTIES_VALUES в значении столбца. Но он должен иметь оба значения (черный и XS)
Есть идеи?
ОБНОВЛЕНИЕ - РЕШЕНО
Хорошо, я наконец решил это. Вот мой код:
$query->whereHas('variants', function ($query) use ($variants) {
$i = 1;
foreach($variants as $variant)
{
if($i == 1) {
$query->whereHas('properties', function($query) use ($variant) {
$query->whereHas('propertiesValues', function($query) use ($variant) {
$query->whereIn('value', $variant);
});
}, '=', count($variant));
} else {
$query->orWhereHas('properties', function($query) use ($variant) {
$query->whereHas('propertiesValues', function($query) use ($variant) {
$query->whereIn('value', $variant);
});
}, '=', count($variant));
}
$i++;
}
});
Есть идеи, как сделать его менее сложным? :)