Kolekcja z FIND_IN_SET na atrybutach wielokrotnego wyboru, ale niektóre mają tylko jedną wartość

9

Buduję kolekcję produktów, która znajdzie wyniki z atrybutu wielokrotnego wyboru.

(odpowiedni kod, który dodaje zestaw finset do kolekcji - dostosowany do wyświetlania rzeczywistych wartości identyfikatora)

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

Wynikowy kod SQL (z dodanym filtrem widoczności) jest taki:

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

Problem polega na tym, że pojawia się błąd SQL:

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

i myślę, że rozumiem, dlaczego: Niektóre wartości wielokrotnego wyboru mają tylko jedną opcję, dlatego nie ma wartości oddzielonych przecinkami, które kwalifikowałyby się do FINSET

Czy mam rację, dlaczego pojawia się ten błąd? Jak mogę zapisać ten obiekt kolekcji, aby to uwzględnić?

Jeśli nie powyższe, czego mi brakuje?

Wyniki z uruchomienia sql w mysql workbench, pomniejszone o klauzulę find_in_set:

wyniki sprawdzane w edytorze zapytań

ProxiBlue
źródło

Odpowiedzi:

26

Spróbuj użyć addAttributeToFilter z parametrem lub condition

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

Lub

$collection->addAttributeToFilter(
    array(
        array('attribute'=> 'attributecode','finset' => array('237')),
        array('attribute'=> 'attributecode','finset' => array('237')),
        array('attribute'=> 'attributecode','finset' => array('237')),
    )
);
oleksii.svarychevskyi
źródło
1
Jak możemy NIE wykonać FIND_IN_SET?
Slimshadddyyy
Jak używać warunku „ORAZ”
Deeban Babu
1
Dla „ORAZ” wystarczy powtórzyć $ collection-> addAttributeToFilter () dla każdej wartości
Wouter