コレクション-複数の複数選択属性値のフィルタリング


8

それはタイプミスではありません。

複数選択属性をフィルター処理するには 'finset'を使用する必要があることを認識しています。しかし、私は一度に複数の値をフィルタリングして、以下を取得しようとしています:

Incorrect parameter count in the call to native function 'FIND_IN_SET

ここにいくつかのサンプルコードがあります:

foreach ($options as $option) {
    // $option[0] contains an attribute ID as a string
    $attribute = Mage::getModel('catalog/resource_eav_attribute')->load($option[0]);

    if ($attribute->getFrontendInput() == 'multiselect') {
        $collection->addAttributeToFilter($attribute->getAttributeCode(), array('finset' => $option[1]));
    } else {
        $collection->addAttributeToFilter($attribute->getAttributeCode(), array('in' => $option[1]));
    }
}

フロントエンドにあるのはフィールドのセットです。各セットは特定の属性に対応し、各属性値のチェックボックスが含まれています。これらの提出に基づいて、コレクションは選択されたものを除外する必要があります。

複数選択オプションの2つを同時にフィルターにかけようとする1つの場合を除いて、すべてがうまく機能します。そのうちの1つだけを選択した場合、検索は正しく機能します。2つ以上選択すると、上記のMySQLエラーが発生します。

何か案は?それとも、このフィルターを作成するためにカスタムSQLステートメントを使用する必要がありますか?


複数の選択した入力タイプをフィルタリングしようとしている場合は、catalog_product_index_eav_idxテーブルを使用してフィルタリングしてみてください。
Subesh Pokhrel 2014年

回答:


18

私が理解していることから、2つ以上の値を送信し、を使用してそれらでフィルタリングする必要がありますOR
このようなもの:

...
WHERE
    FIND_IN_SET($v1, `some_field`) OR
    FIND_IN_SET($v2, `some_field`) OR
...

$v1 & $v2 チェックボックスの値です

そのためにはaddAttributeToFilter、配列の配列に渡す必要があります。

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);

以下は可能な実装です。

$data = THE ARRAY OF THE CHECKBOX VALUES;

$filter = array();
foreach ($data as $value) {
    $filter[] = array(
        'attribute' => $attribute->getAttributeCode(),
        'finset'    => $value
    );
}

if (count($filter) > 0) {
    $collection->addAttributeToFilter($filter);
}

私はこのようにカテゴリIDを取得しています($ exist_prdcat_id = 4,5なので、-> addAttributeToFilter( 'category_id'、array(array( 'finset' => array($ exist_prdcat_id))、));を使用していますが、私は取得していません製品なぜですか??教えていただけますか
ND17 '30 / 10/30

start_dateとend_dateをフィルター処理したいのですが、どうすればよいですか?
MrTo-Kane 2016

このコードはどこに配置すればよいですか?
zekia

@ktsixit必要な場所。
マリウス

「and」を実行するにはどうすればよいですか。複数の複数選択属性値に基づいて製品コレクションをフィルタリングしたいのです。@マリウスはあなたを助けることができますか?
ジャック、

-1

このコードは、次の2つのfinset条件を組み合わせますOR

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.