集合-过滤多个多选属性值


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]));
    }
}

我在前端有一组字段,每个字段对应一个特定的属性,并包含每个属性值的复选框。根据这些提交的内容,集合应过滤掉已选择的内容。

除了我尝试同时过滤两个多选选项的单一情况外,其他所有功能都工作正常。如果我仅选择其中之一,则搜索将正常进行。如果选择两个或多个,则会出现上述MySQL错误。

有任何想法吗?还是我被迫使用自定义SQL语句来构建此过滤器?


如果要过滤多个选择输入类型,请尝试使用catalog_product_index_eav_idx表进行过滤。
Subesh Pokhrel 2014年

Answers:


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 2015年

我要过滤开始日期和结束日期,您该怎么办?
MrTo-Kane'3

我应该在哪里放置此代码?
zekia

@ktsixit您需要的地方。
马吕斯

我该如何执行“和”。我的意思是要基于多个多重选择属性值过滤产品集合。@Marius您能帮忙吗?
杰克

-1

该代码将结合以下两个finset条件OR

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.