複数選択属性でFIND_IN_SETを使用したコレクションですが、一部には1つの値しかありません


9

複数選択属性からの結果を見つける製品コレクションを構築しています。

(コレクションにフィンセットを追加する関連コード-実際のID値を表示するように調整)

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

結果のsql(visiblityフィルターが追加されたもの)は次のとおりです。

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

問題は、SQLエラーが発生することです。

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

そして、私は(私が思う)理由を理解することができます:複数選択値の一部にはオプションが1つしかないため、FINSETの対象となるカンマ区切りの値はありません

このエラーが発生する理由は正しいですか?これを説明するために、このコレクションオブジェクトをどのように記述できますか?

上記でない場合、何が欠けていますか?

mysqlワークベンチでSQLを実行した結果から、find_in_set句を除いた結果:

クエリエディターでチェックされた結果


回答:


26

addAttributeToFilterをor条件で使用してみてください

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

または

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

1
FIND_IN_SETを実行するにはどうすればよいですか?
Slimshadddyyy 2014年

「AND」条件の使用方法
ディーバンバブ

1
「AND」の場合は、値ごとに$ collection-> addAttributeToFilter()を繰り返すだけです
Wouter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.