Colecciones: filtrado de múltiples valores de atributos de selección múltiple

8

Eso no es un error tipográfico.

Soy consciente de que necesito usar 'finset' para filtrar mis atributos de selección múltiple; Sin embargo, estoy tratando de filtrar varios valores a la vez y obtengo:

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

Aquí hay un código de muestra:

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

Lo que tengo en la interfaz es un conjunto de campos, cada conjunto corresponde a un atributo específico y contiene casillas de verificación para cada valor de atributo. Según estas presentaciones, la colección debe filtrar lo que se ha seleccionado.

Todo funciona muy bien, excepto el caso único en el que intento filtrar dos de las opciones de selección múltiple al mismo tiempo. Si solo elijo uno de ellos, la búsqueda funciona correctamente. Si elijo dos o más, obtengo el error de MySQL mencionado anteriormente.

¿Algunas ideas? ¿O me veo obligado a usar sentencias SQL personalizadas para construir este filtro?

pspahn
fuente
Si está tratando de filtrar el tipo de entrada de selección múltiple, intente filtrar usando la catalog_product_index_eav_idxtabla.
Subesh Pokhrel

Respuestas:

18

Por lo que entiendo, desea enviar 2 o más valores y filtrarlos usando OR.
Algo como esto:

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

$v1 & $v2 son los valores de tus casillas de verificación

Para eso necesita pasar a la addAttributeToFiltermatriz de matrices.

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

Aquí hay una posible implementación.

$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
fuente
Estoy obteniendo mi ID de categoría de esta manera ($ exist_prdcat_id = 4,5, así que uso -> addAttributeToFilter ('category_id', array (array ('finset' => array ($ exist_prdcat_id)),)); pero no estoy obteniendo producto ¿por qué? ¿Puedes decirme esto
ND17
Quiero filtrar fecha_inicio y fecha_final. ¿Cómo lo hace?
MrTo-Kane
¿Dónde debo colocar este código?
zekia
@ktsixit Donde lo necesite.
Marius
¿Cómo puedo realizar 'y'? Me refiero a querer filtrar la colección de productos en función de múltiples valores de atributos de selección múltiple. @ Mario ¿puedes ayudar?
Jack
-1

Este código combinará dos finsetcondiciones con OR:

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