У меня есть product
с несколькими skus
.Каждый sku
имеет множество attributes
.
Каждый атрибут имеет type
, который может быть чем-то вроде "size" или "color", и value
, который будет что-то вроде "M"или "черный".
У каждого продукта есть произвольное число attributes
, которое я выбрал в форме для выбора.
Теперь у меня есть список каждого атрибута и его значения.
[
'size' => 'M',
'color' => 'black',
]
Отлично.Теперь мне нужно получить SKU, которые соответствуют этим конкретным атрибутам.
Например, это работает, когда у меня только один атрибут.
$product->skus->whereHas('attributes', function($query) {
return $query->where(['type' => 'size', 'value' => 'M']);
})->get();
Но как мне построитьзапрос, который возвращает только те скусы, атрибуты которых соответствуют ВСЕМ квалификациям?
И помните, эти атрибуты произвольны по количеству.Я не могу жестко закодировать это;Мне просто нужно передать массив пар тип-значение.
Я выяснил, как это сделать вручную - но опять-таки он не учитывает произвольное количество атрибутов.Плюс, это неуклюже.Примерно так:
$product->skus->whereHas('attributes', function($query) {
return $query->where(['type' => 'size', 'value' => 'M']);
})->whereHas('attributes', function($query) {
return $query->where(['type' => 'color', 'value' => 'white']);
})->get();
Редактировать: Кажется, что работает следующий код, но он чертовски неуклюж.Должен быть лучший способ сделать это?
$list = $this->skus()->with('attributes');
foreach ($attrs as $type => $value) {
$list->whereHas('attributes', function ($query) use ($type, $value) {
return $query->where(['type' => $type, 'value' => $value]);
});
}
return $list->first();