Коллекции - Фильтрация нескольких значений атрибутов с множественным выбором


Это не опечатка.

Я знаю, что мне нужно использовать "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 для создания этого фильтра?

Author: pspahn, 2014-01-30

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);
}
 20
Author: Marius, 2014-01-30 07:18:46

Этот код объединит два условия finset с OR:

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);
 -1
Author: name, 2015-07-08 11:53:06