Laravel-запрос hasMany, где строки с пользовательскими значениями - PullRequest
0 голосов
/ 13 сентября 2018

В моей БД есть следующие таблицы:

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++;
        }
    });

Есть идеи, как сделать его менее сложным? :)

1 Ответ

0 голосов
/ 13 сентября 2018

Вложенный имеет или , где операторы также могут быть построены с использованием "точечной" записи. Например, вы можете получить все сообщения, которые имеют хотя бы один комментарий и голосовать. Так что, если вы хотите запросить вложенные варианты_произведений у продуктов, вы должны поставить его с точками ' ratio1.relation2 ', гдеHas

$ids = [1,2];
$products = Product::whereHas('variants.variants_properties', function ($query) use ($ids) {
    $query->whereIn('property_value_id', $ids);
})->get();
...