Sammlung mit FIND_IN_SET für Mehrfachauswahlattribute, einige haben jedoch nur einen Wert


9

Ich baue eine Produktkollektion auf, die Ergebnisse aus einem Mehrfachauswahlattribut findet.

(relevanter Code, der der Sammlung einen Finset hinzufügt - angepasst, um echte ID-Werte anzuzeigen)

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

Das resultierende SQL (mit hinzugefügtem Sichtbarkeitsfilter) ist wie folgt:

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

Das Problem ist, dass ich einen SQL-Fehler erhalte:

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

und ich (denke) ich kann verstehen warum: Einige der Multiselect-Werte haben nur eine Option, daher gibt es keine durch Kommas getrennten Werte, um sich für FINSET zu qualifizieren

Stimmt es, warum dieser Fehler auftritt? Wie kann ich dieses Sammlungsobjekt schreiben, um dies zu berücksichtigen?

Wenn nicht, was fehlt mir?

Die Ergebnisse der Ausführung von SQL in der MySQL-Workbench abzüglich der Klausel find_in_set:

Ergebnisse im Abfrageeditor überprüft


Antworten:


25

Versuchen Sie, addAttributeToFilter mit oder Bedingung zu verwenden

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

Oder

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

1
Wie können wir NICHT FIND_IN_SET machen?
Slimshadddyyy

Verwendung der '
UND'

1
Für "UND" wiederholen Sie einfach die $ collection-> addAttributeToFilter () für jeden Wert
Wouter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.