Bộ sưu tập - Lọc nhiều giá trị thuộc tính đa lựa chọn


8

Đó không phải là một lỗi đánh máy.

Tôi biết rằng tôi cần sử dụng 'finset' để lọc các thuộc tính đa lựa chọn của mình; tuy nhiên, tôi đang cố gắng lọc nhiều giá trị cùng một lúc và nhận được:

Incorrect parameter count in the call to native function 'FIND_IN_SET.

Đây là một số mã mẫu:

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

Những gì tôi có trên frontend là một tập hợp các trường, mỗi bộ tương ứng với một thuộc tính cụ thể và chứa các hộp kiểm cho mỗi giá trị thuộc tính. Dựa trên những bài nộp này, bộ sưu tập sẽ lọc ra những gì đã được chọn.

Tất cả mọi thứ hoạt động tuyệt vời ngoại trừ trường hợp duy nhất mà tôi cố gắng lọc hai trong số các tùy chọn đa lựa chọn cùng một lúc. Nếu tôi chỉ chọn một trong số họ, tìm kiếm hoạt động đúng. Nếu tôi chọn hai hoặc nhiều hơn, tôi nhận được lỗi MySQL được đề cập ở trên.

Có ý kiến ​​gì không? Hay tôi buộc phải sử dụng các câu lệnh SQL tùy chỉnh để xây dựng bộ lọc này?


Nếu bạn đang cố lọc nhiều loại đầu vào, hãy thử lọc bằng catalog_product_index_eav_idxbảng.
Subesh Pokhrel

Câu trả lời:


18

Từ những gì tôi hiểu, bạn muốn gửi 2 hoặc nhiều giá trị và lọc theo chúng bằng cách sử dụng OR.
Một cái gì đó như thế này:

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

$v1 & $v2 là các giá trị của hộp kiểm tra của bạn

Cho rằng bạn cần phải vượt qua addAttributeToFiltervà mảng của mảng.

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

Đây là một thực hiện có thể.

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

Tôi đang nhận id danh mục của mình như thế này ($ tồn tại_prdcat_id = 4,5 vì vậy tôi sử dụng -> addAttributionToFilter ('category_id', mảng (mảng ('finset' => mảng ($ tồn tại sản phẩm tại sao ?? bạn có thể cho tôi biết điều này
ND17

Tôi muốn lọc start_date và end_date, bạn phải làm thế nào?
MrTo-Kane

Tôi nên đặt mã này ở đâu ??
zekia

@ktsixit Nơi bạn cần nó.
Marius

Làm thế nào tôi có thể thực hiện 'và'. Ý tôi là muốn lọc bộ sưu tập sản phẩm dựa trên nhiều giá trị thuộc tính đa lựa chọn. @Marius bạn có thể giúp gì không?
jack

-1

Mã này sẽ kết hợp hai finsetđiều kiện với OR:

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.