У меня есть следующие таблицы в моей БД:
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.
Любые идеи?
ОБНОВИТЬ:
Я использовал ответ Александра Питерса. Вот мой код:
$query->whereHas('variants.properties.propertiesValues', function ($query) use ($variants) {
$query->whereIn('value', $variants);
});
Чтобы быть более конкретным, у меня есть еще одна таблица в моем запросе, которую я не указывал раньше. Этот запрос работает, но не так, как ожидалось. Что я хочу сделать, так это: получить все ПРОДУКТЫ, у которых есть PRODUCTS_VARIANTS, которые имеют PRODUCTS_VARIANTS_PROPERTIES, которые имеют PRODUCTS_PROPERTIES_VALUES в качестве активного фильтра (ВАРИАНТЫ). Я знаю все варианты - я использую для этого декартово произведение. Так, например, мне нужно получить все продукты, у которых есть варианты, которые имеют все значения из варианта в фильтре. Этот запрос работает, только если есть варианты только с 1 значением. Как я могу это решить? Я пытаюсь использовать foreach($variants as...), но безуспешно. Все еще не работает на 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
]
]
Мне нужно проверить значения из массива ВАРИАНТОВ в последней таблице 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++;
}
});
Есть идеи, как сделать его менее сложным? :)