Coleções - Filtrando vários valores de atributos de seleção múltipla

8

Isso não é um erro de digitação.

Estou ciente de que preciso usar 'finset' para filtrar meus atributos de seleção múltipla; no entanto, estou tentando filtrar vários valores ao mesmo tempo e obter:

Incorrect parameter count in the call to native function 'FIND_IN_SET.

Aqui está um exemplo de código:

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]));
    }
}

O que tenho no front-end é um conjunto de campos, cada conjunto corresponde a um atributo específico e contém caixas de seleção para cada valor de atributo. Com base nesses envios, a coleção deve filtrar o que foi selecionado.

Tudo funciona muito bem, exceto no caso único em que tento filtrar duas opções de seleção múltipla ao mesmo tempo. Se eu escolher apenas um deles, a pesquisa funcionará corretamente. Se eu escolher dois ou mais, recebo o erro do MySQL mencionado acima.

Alguma ideia? Ou sou forçado a usar instruções SQL personalizadas para criar esse filtro?

pspahn
fonte
Se você estiver tentando filtrar vários tipos de entrada selecionados, tente filtrar usando a catalog_product_index_eav_idxtabela.
Subesh Pokhrel 01/03

Respostas:

18

Pelo que entendi, você deseja enviar 2 ou mais valores e filtrar por eles usando OR.
Algo assim:

...
WHERE
    FIND_IN_SET($v1, `some_field`) OR
    FIND_IN_SET($v2, `some_field`) OR
...

$v1 & $v2 são os valores das suas caixas de seleção

Para isso, você precisa passar para a addAttributeToFiltermatriz de matrizes.

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);

Aqui está uma possível implementação.

$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);
}
Marius
fonte
Estou recebendo meu ID de categoria como este ($ exist_prdcat_id = 4,5, então eu uso -> addAttributeToFilter ('category_id', array (array ('finset' => array ($ exist_prdcat_id)),)); mas não estou recebendo produto por que? você pode me dizer isso #
ND17
Quero filtrar as datas de início e de término, como vai?
MrTo-Kane
onde devo colocar esse código ??
zekia
@ktsixit Onde você precisar.
Marius
Como posso executar 'e'. Quero dizer, quero filtrar a coleção de produtos com base em vários valores de atributos de seleção múltipla. @Marius você pode ajudar?
jack
-1

Este código combinará duas finsetcondições com OR:

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);
nome
fonte