Laravel Eloquent фильтрует атрибуты продукта - PullRequest
0 голосов
/ 22 мая 2019

Я делаю функцию фильтра для продуктов.У меня есть 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();

1 Ответ

0 голосов
/ 22 мая 2019

Попробуйте вместо этого:

$products = Product::whereHas('attributes', function ($query) {
    $query
        ->whereIn('attribute_id', [1, 2])
        ->whereIn('value', ['4GB', '8GB', '256GB']);
})->get();

Вы должны объединить эти whereIn().

В сигнатуре метода вы можете отметить третий необязательный $booleanпараметр:

whereIn(string $column, mixed $values, string $boolean = 'and', bool $not = false)

Обновление: raw SQL .Я предпочел бы пойти с сырым Eloquent запросом в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...