Застрял с запросом Laravel - PullRequest
       3

Застрял с запросом Laravel

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

Я пытаюсь написать систему фильтров, используя laravel, вот такая ситуация:

Вот мой массив $inputs.Цвета - это флажки, а материал - выпадающий список:

$inputs = [
    'colors' => ['green' => 'green', 'red' => 'red'],
    'material' => 'wood',
]

Вот таблица (variants_values), на которую я смотрю.Здесь я храню все комбинации свойств для моих вариантов:

id  | product_id | variant_id | property_id |   label   | value
550           91          213             1    color      green
551           91          213             2    material   wood
552           91          214             1    color      red
552           91          214             2    material   plastic

Вот мой запрос.Цель состоит в том, чтобы вернуть соответствующие продукты, поэтому я использую метод whereHas() для создания подзапроса над моим variants_values:

    foreach($inputs as $key => $input) {
        $products->whereHas('variants_values', function($query) use($key, $input) {
            if(is_array($input)) {
                $query->where('label', $key)->whereIn('value', $input);
            } elseif(!empty($input)) {
                $query->where('label', $key)->where('value', $input);
            }

        });
    }

Этот код работает довольно хорошо, за исключением одной ситуации:

  • Если я проверю green цвет и wood материал, я хочу, чтобы мой продукт 91 был возвращен, как это.

НО

  • Если я проверяю red цвет и wood материал, я не хочу результатов, потому что вариант red сделан из plastic, а не wood.

На самом деле, продукт 91 по-прежнему возвращается, потому что на самом деле мой код не проверяет, соответствует ли он тому же варианту, что и $inputs;

Так что мне нужно что-то в моем коде, которое скажет:

foreach($inputs as $key => $input) {
    $products->whereHas('variants_values', function($query) use($key, $input) {
        if(is_array($input)) {
            $query->where('label', $key)->whereIn('value', $input);
        } elseif(!empty($input)) {
            $query->where('label', $key)->where('value', $input);
        }
        ##
        $query->where('Verify that the variant ID is the same or something like that');
        ##
    });
}

Я знаю, что не далеко от решения, но я застрял здесь на самом деле.

Спасибо за вашу помощь

1 Ответ

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

Похоже, для этого требуется более сложный запрос.

Поместите это в вашу Product модель:

public function variants() {
    return $this->belongsToMany(Variant::class, 'variants_values');
}

Скопируйте отношение variants_values в вашу модель Variant.

Тогда попробуйте это:

$products->whereHas('variants', function($query) use($inputs) {
    foreach($inputs as $key => $input) {
        $query->whereHas('variants_values', function($query) use($key, $input) {
            $query->whereColumn('product_id', 'products.id');
            if(is_array($input)) {
                $query->where('label', $key)->whereIn('value', $input);
            } elseif(!empty($input)) {
                $query->where('label', $key)->where('value', $input);
            }
        });
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...