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

8

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

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

pspahn
источник
Если вы пытаетесь отфильтровать несколько выбранных типов ввода, попробуйте выполнить фильтрацию по catalog_product_index_eav_idxтаблице.
Субеш Покхрел

Ответы:

18

Из того, что я понимаю, вы хотите отправить 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);
}
Мариус
источник
Я получаю свой идентификатор категории следующим образом ($ exist_prdcat_id = 4,5, поэтому я использую -> addAttributeToFilter ('category_id', array (array ('finset' => array ($ exist_prdcat_id)),)); но я не получаю продукт почему ?? Вы можете сказать мне это
ND17
Я хочу отфильтровать start_date и end_date, как поживаете?
MrTo-Kane
где я должен разместить этот код ??
Зекия
@ktsixit Где вам это нужно.
Мариус
Как я могу выполнить «и». Я имею в виду хочу отфильтровать коллекцию товаров на основе нескольких множественных значений атрибутов. @ Мариус, можешь помочь?
Джек,
-1

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

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);
имя
источник