Koleksi - Memfilter beberapa nilai atribut multi-pilih

8

Itu bukan kesalahan ketik.

Saya sadar bahwa saya perlu menggunakan 'finset' untuk memfilter atribut multi-pilih saya; namun, saya mencoba memfilter beberapa nilai sekaligus dan mendapatkan:

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

Berikut beberapa contoh kode:

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

Apa yang saya miliki di frontend adalah seperangkat bidang, masing-masing set sesuai dengan atribut tertentu dan berisi kotak centang untuk setiap nilai atribut. Berdasarkan kiriman ini, koleksi harus menyaring apa yang telah dipilih.

Semuanya berfungsi dengan baik kecuali untuk satu kotak di mana saya mencoba memfilter dua opsi multi-pilih secara bersamaan. Jika saya hanya memilih salah satunya, pencarian berfungsi dengan baik. Jika saya memilih dua atau lebih, saya mendapatkan kesalahan MySQL yang disebutkan di atas.

Ada ide? Atau apakah saya dipaksa untuk menggunakan pernyataan SQL khusus untuk membangun filter ini?

pspahn
sumber
Jika Anda mencoba memfilter beberapa tipe input pilih, cobalah pemfilteran menggunakan catalog_product_index_eav_idxtabel.
Subesh Pokhrel

Jawaban:

18

Dari apa yang saya pahami, Anda ingin mengirim 2 atau lebih nilai dan memfilternya menggunakan mereka OR.
Sesuatu seperti ini:

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

$v1 & $v2 adalah nilai-nilai kotak centang Anda

Untuk itu Anda perlu meneruskan ke addAttributeToFilterarray dan array.

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

Berikut ini adalah kemungkinan implementasi.

$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);
}
Marius
sumber
Saya mendapatkan id kategori saya seperti ini ($ exist_prdcat_id = 4,5 jadi saya menggunakan -> addAttributeToFilter ('category_id', array (array ('finset' => array ($ exist_prdcat_id)),)); tetapi saya tidak mendapatkan produk kenapa ?? bisakah kamu ceritakan ini
ND17
Saya ingin memfilter start_date dan end_date, Bagaimana Anda melakukannya?
MrTo-Kane
di mana saya harus meletakkan kode ini ??
zekia
@ktsixit Di mana Anda membutuhkannya.
Marius
Bagaimana saya bisa melakukan 'dan'. Maksud saya ingin memfilter koleksi produk berdasarkan beberapa nilai atribut multi-pilih. @Marius, bisakah Anda membantu?
jack
-1

Kode ini akan menggabungkan dua finsetkondisi dengan OR:

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