Коллекции - Фильтрация нескольких значений атрибутов с множественным выбором
Это не опечатка.
Я знаю, что мне нужно использовать "finset" для фильтрации атрибутов с несколькими вариантами выбора; однако я пытаюсь отфильтровать несколько значений одновременно и получаю:
Incorrect parameter count in the call to native function 'FIND_IN_SET
.
Вот пример кода:
foreach ($options as $option) {
// $option[0] contains an attribute ID as a string
$attribute = Mage::getModel('catalog/resource_eav_attribute')->load($option[0]);
if ($attribute->getFrontendInput() == 'multiselect') {
$collection->addAttributeToFilter($attribute->getAttributeCode(), array('finset' => $option[1]));
} else {
$collection->addAttributeToFilter($attribute->getAttributeCode(), array('in' => $option[1]));
}
}
То, что у меня есть на интерфейсе, - это набор полей, каждый набор соответствует определенному атрибуту и содержит флажки для каждого значения атрибута. Основываясь на этих представлениях, коллекция должна отфильтровывать то, что было выбранный.
Все работает отлично, за исключением одного случая, когда я пытаюсь отфильтровать два варианта с несколькими вариантами выбора одновременно. Если я выберу только один из них, поиск будет работать правильно. Если я выберу два или более, я получу ошибку MySQL, упомянутую выше.
Есть идеи? Или я вынужден использовать пользовательские инструкции SQL для создания этого фильтра?
2 answers
Насколько я понимаю, вы хотите отправить 2 или более значений и отфильтровать их с помощью OR
.
Что-то вроде этого:
...
WHERE
FIND_IN_SET($v1, `some_field`) OR
FIND_IN_SET($v2, `some_field`) OR
...
$v1 & $v2
являются ли значения ваших флажков
Для этого вам нужно перейти к addAttributeToFilter
и массиву массивов.
->addAttributeToFilter(
array(
array('attribute'=>'some_attribute', 'finset'=>$v1),
array('attribute'=>'some_attribute', 'finset'=>$v2),
)
);
Вот возможная реализация.
$data = THE ARRAY OF THE CHECKBOX VALUES;
$filter = array();
foreach ($data as $value) {
$filter[] = array(
'attribute' => $attribute->getAttributeCode(),
'finset' => $value
);
}
if (count($filter) > 0) {
$collection->addAttributeToFilter($filter);
}
Этот код объединит два условия finset
с OR
:
->addAttributeToFilter(
array(
array('attribute'=>'some_attribute', 'finset'=>$v1),
array('attribute'=>'some_attribute', 'finset'=>$v2),
)
);