Raccolta con FIND_IN_SET su attributi multi-selezione, ma alcuni hanno un solo valore


9

Sto creando una raccolta di prodotti, che troverà risultati da un attributo a selezione multipla.

(codice pertinente che aggiunge il finset alla raccolta - adattato per visualizzare i valori ID reali)

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

Il sql risultante (con l'aggiunta del filtro di visibilità) è come tale:

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

Il problema è che ottengo un errore sql:

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

e io (penso) capisco perché: alcuni dei valori a selezione multipla hanno una sola opzione, quindi non ci sono valori separati da virgola per qualificarsi per FINSET

Sono corretto nel perché questo errore viene prodotto? Come posso scrivere questo oggetto di raccolta per tener conto di ciò?

Se non quanto sopra, cosa mi sto perdendo?

I risultati dell'esecuzione di sql in mysql workbench, meno la clausola find_in_set:

risultati controllati nell'editor di query


Risposte:


26

Prova a utilizzare addAttributeToFilter con o condition

$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')),
    )
);

1
Come possiamo NON FIND_IN_SET?
Slimshadddyyy,

Come usare la condizione "AND"
Deeban Babu,

1
Per "AND", ripeti $ collection-> addAttributeToFilter () per ogni valore
Wouter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.