Colección con FIND_IN_SET en atributos de selección múltiple, pero algunos solo tienen un valor

9

Estoy creando una colección de productos, que encontrará resultados de un atributo de selección múltiple.

(código relevante que agrega finset a la colección, ajustado para mostrar valores de identificación reales)

$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 'measurement');
    $value = array('finset' => array('237',
                '236',
                '235',
                '234',
                '233',));
    $collection->addAttributeToFilter($attribute, $value);

El sql resultante (con filtro de visibilidad agregado) es como tal:

SELECT DISTINCT
    e . *,
    at_measurement.value AS measurement,
    at_visibility.value AS visibility
FROM
    catalog_product_entity AS e
        INNER JOIN
    catalog_product_entity_varchar AS at_measurement ON (at_measurement.entity_id = e.entity_id) AND (at_measurement.attribute_id = '983') AND (at_measurement.store_id = 0)
        INNER JOIN
    catalog_product_entity_int AS at_visibility ON (at_visibility.entity_id = e.entity_id) AND (at_visibility.attribute_id = '526') AND (at_visibility.store_id = 0)
WHERE
    (e.attribute_set_id IN ('74')) AND (FIND_IN_SET('237',
            '236',
            '235',
            '234',
            '233',
            at_measurement.value)) AND (at_visibility.value IN ('2' , '4'))
GROUP BY e.entity_id

El problema es que me sale un error sql:

"SQLSTATE[42000]: Syntax error or access violation: 1582 Incorrect parameter count in the call to native function 'FIND_IN_SET'"

y (creo) puedo ver por qué: algunos de los valores de selección múltiple tienen solo una opción, por lo tanto, no hay valores separados por comas para calificar para FINSET

¿Estoy en lo cierto por qué se produce este error? ¿Cómo puedo escribir este objeto de colección para dar cuenta de esto?

Si no es lo anterior, ¿qué me estoy perdiendo?

Los resultados de ejecutar sql en mysql workbench, menos la cláusula find_in_set:

resultados verificados en el editor de consultas

ProxiBlue
fuente

Respuestas:

26

Intente usar addAttributeToFilter con o condición

$collection->addAttributeToFilter($attribute,
    array(
        array('finset'=> array('237')),
        array('finset'=> array('238')),
        array('finset'=> array('239')),
    )
);

O

$collection->addAttributeToFilter(
    array(
        array('attribute'=> 'attributecode','finset' => array('237')),
        array('attribute'=> 'attributecode','finset' => array('237')),
        array('attribute'=> 'attributecode','finset' => array('237')),
    )
);
oleksii.svarychevskyi
fuente
1
¿Cómo podemos NO FIND_IN_SET?
Slimshadddyyy
Cómo usar la condición 'Y'
Deeban Babu
1
Para "Y", simplemente repita $ colección-> addAttributeToFilter () para cada valor
Wouter