Pregunta

Estoy construyendo una colección de productos, que encontrará resultados de un atributo multiselecto.

(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 el filtro de visible 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 recibo un error SQL:

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

Y yo (creo) puedo ver por qué: algunos de los valores multiselecto tienen solo una opción, por lo tanto, no hay valores separados por coma para calificar para Finset

¿Tengo razón en 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 el SQL en MySQL Workbench, menos la cláusula Find_in_Set:

results checked in query editor

¿Fue útil?

Solución

Intente usar addatTributTOfilter 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')),
    )
);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top