Collezione con FIND_IN_SET sugli attributi MultiSelect, ma alcuni ha solo valore
-
16-10-2019 - |
Domanda
Sto costruendo una collezione di prodotti, che troverà i risultati di un attributo di selezione multipla.
(relativo codice che aggiunge finset alla raccolta - rettificato per visualizzare i valori reali id)
$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 'measurement');
$value = array('finset' => array('237',
'236',
'235',
'234',
'233',));
$collection->addAttributeToFilter($attribute, $value);
SQL risultante (con filtro visiblity aggiunto) è 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'"
ed io (si pensi) posso capire perché: Alcuni dei valori MultiSelect hanno una sola opzione, quindi non v'è alcuna separati da virgola i valori di qualificarsi per FINSET
Sono corretto perché si produce questo errore? Come faccio a scrivere questo oggetto di raccolta per conto di questo?
In caso contrario quanto sopra, che cosa mi manca?
I risultati dell'esecuzione del SQL in MySQL Workbench, meno la clausola di find_in_set:
Soluzione
Provare a utilizzare addAttributeToFilter con o condizione
$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')),
)
);