Collection avec FIND_IN_SET sur des attributs multisélection, mais certains n'ont qu'une seule valeur


9

Je crée une collection de produits qui trouvera les résultats d'un attribut multisélection.

(code pertinent qui ajoute le jeu de fins à la collection - ajusté pour afficher les valeurs réelles de l'identifiant)

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

Le sql résultant (avec filtre de visibilité ajouté) est en tant que tel:

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

Le problème est que j'obtiens une erreur SQL:

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

et je (pense) je peux voir pourquoi: Certaines des valeurs multisélection n'ont qu'une seule option, donc il n'y a pas de valeurs séparées par des virgules pour se qualifier pour FINSET

Suis-je correct dans pourquoi cette erreur est produite? Comment puis-je écrire cet objet de collection pour en tenir compte?

Sinon, que me manque-t-il?

Les résultats de l'exécution de sql dans mysql workbench, moins la clause find_in_set:

résultats vérifiés dans l'éditeur de requêtes


Réponses:


26

Essayez d'utiliser addAttributeToFilter avec ou condition

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

Ou

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

1
Comment ne PAS TROUVER_IN_SET?
Slimshadddyyy

Comment utiliser la condition 'ET'
Deeban Babu

1
Pour "ET", répétez simplement $ collection-> addAttributeToFilter () pour chaque valeur
Wouter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.