Сейчас получилось сделать только выборку по отдельным параметрам, то есть если указать еще один параметр, то все товары с ним добавляются в выборку, независимо от других параметров (плюсуются). А нужно товары, которые имеют эти параметры одновременно.
структура:
кусок кода из searchModel: (костыль, но работает)
Код: Выделить всё
public function search($data, $query)
{
$query->select(['product.id', 'product.price'])
->groupBy('id');
$this->load($data);
if ($this->parameters) {
$query->joinWith(['parameterValues'], false);
}
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
...
if ($this->parameters) {
$queryString = '';
$i = 0;
$count = count($this->parameters);
foreach ($this->parameters as $parameterId => $parameterValueIDs) {
$parameterId = (int)$parameterId;
if ($parameterId < 1) {
return $dataProvider;
}
if (is_array($parameterValueIDs)) {
$resultParameterValueIDs = 'IN (';
$countOfValues = count($parameterValueIDs);
$lastValueIndex = $countOfValues - 1;
for ($k = 0; $k < $countOfValues; $k++) {
$resultParameterValueIDs .= (int)$parameterValueIDs[$k];
if ($parameterValueIDs[$k] < 1) {
return $dataProvider;
}
if ($k < $lastValueIndex) {
$resultParameterValueIDs .= ',';
}
}
$resultParameterValueIDs .= ')';
} else {
$parameterValueIDs = (int)$parameterValueIDs;
$resultParameterValueIDs = '= ' . $parameterValueIDs;
}
$queryString .= '((`parameter_value`.`id` ' . $resultParameterValueIDs . ') AND (`parameter_value`.`parameter_id` = ' . $parameterId . '))';
if ($i < $count - 1) {
$queryString .= ' OR ';
}
$i++;
}
$query->andWhere($queryString);
}
Вот такие запросы получаются при фильтрации:
Код: Выделить всё
SELECT `product`.`id`, `product`.`price`
FROM `product`
LEFT JOIN `product_parameter_value` ON `product`.`id` = `product_parameter_value`.`product_id`
LEFT JOIN `parameter_value` ON `product_parameter_value`.`parameter_value_id` = `parameter_value`.`id`
WHERE (`product`.`status`=10)
AND (((`parameter_value`.`id` IN (132,130)) AND (`parameter_value`.`parameter_id` = 14)) OR ((`parameter_value`.`id` = 129) AND (`parameter_value`.`parameter_id` = 15)))
AND (`product`.`category_id`=9)
GROUP BY `id`
LIMIT 20
А вот когда у параметра 15 выбраны значения - выбирается отдельные товары с этим параметром и им все равно на параметр 14.
Как выбрать товары у которых значения параметра 14 совпадают с значениями 132 или 130, а так же значения параметра 15 с значением 129?
Фух, не знаю как еще обьяснить. Надеюсь понятно, если нет - напишите, пожалуйста
UPD: как правильно (некостыльно) выбрать (EAV) товары с несколькими параметрами средствами yii2?