Multi Kondisional (OR dan AND di dalam DAN) di addAttributeToFilter

19

Bagaimana cara membuat multi-kondisi di addAttributeToFilter?

Saya ingin menghasilkan query SQL seperti ini (gambar terlampir):

WHERE ((`e`.`news_from_date` > '2013-09-12') OR (`e`.`news_to_date` < '2013-09-12'))
AND ((((`e`.`special_price` IS NULL))) OR (((`e`.`special_price` IS NOT NULL)) AND ((`e`.`special_from_date` < '2013-09-12') OR (`e`.`special_to_date` > '2013-09-12'))))

$collection->addAttributeToFilter('special_price', array('null'=>'special_price'), 'left');

Terima kasihmasukkan deskripsi gambar di sini

Andhi Irawan
sumber
Saya menemukan ini sangat berguna: blog.chapagain.com.np/…
nicolallias

Jawaban:

41

Anda harus dapat menggabungkan sebagian besar teknik ini untuk membuat kueri yang Anda inginkan. Untuk tabel penjualan, Anda mungkin akan menggunakan addFieldToFilter- tetapi Zend_Db_Exprkemungkinan jalur resistensi paling rendah untuk Anda:

addAttributeToFilter:

Menurut Wiki Magento : Saat membuat tanda kurung yang memiliki ORkondisi Anda dapat melakukan hal berikut:

Jika sebuah array dilewatkan tetapi tidak ada kode atribut yang ditentukan, itu akan ditafsirkan sebagai sekelompok kondisi ATAU yang akan diproses dengan cara yang sama.

Jadi, dari situ kita dapat membuat yang berikut:

$collection->addAttributeToFilter(
    array(
        array('attribute'=> 'someattribute','like' => 'value'),
        array('attribute'=> 'otherattribute','like' => 'value'),
        array('attribute'=> 'anotherattribute','like' => 'value'),
    )
);

Ini akan menghasilkan WHEREklausa format:

WHERE ((someattribute LIKE 'value') OR (otherattribute LIKE 'value') OR (anotherattribute LIKE 'value'))

addFieldToFilter:

Dalam kasus di mana model terhubung langsung ke tabel DB, berikut ini diperlukan untuk menerapkan persyaratan ke kolom database dengan nama:

$collection->addFieldToFilter(
    array('title', 'content'),
    array(
        array('like'=>'%$titlesearchtext%'), 
        array('like'=>'%$contentsearchtext%')
    )
)

Zend_Db_Expr:

Untuk konstruksi yang jauh lebih rumit, Anda dapat membuat klausa sendiri di mana menggunakan Zend_Db_Expr. Contohnya :

$collection->getSelect()->where(new Zend_Db_Expr("(e.created_at > '2013-01-01 00:00:00' OR e.created_at <'2012-01-01 00:00:00)"));

Sumber:

/programming/5301231/addattributetofilter-and-or-condition-in-magentos-collection

/programming/3826474/magento-addfieldtofilter-two-fields-match-as-or-not-and/7851884#7851884

Philwinkle
sumber
Terima kasih atas balasan Anda, tetapi hal yang saya inginkan adalah membuat kondisi seperti: WHERE (CONDITION_1 ATAU (CONDITION_2 AND (CONDITION_3 ATAU CONDITION_4)))). Saya sudah memposting pertanyaan yang saya inginkan di atas.
Andhi Irawan
1
Saya pikir saya membuat poin yang dapat Anda gunakan Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle
terima kasih philwinkle.base atas jawaban Anda, ini adalah contoh apa yang saya lakukan dengan addAttributeToFilter dan DAN dan ATAU kondisi: pastebin.com/ZznxLAai
Andhi Irawan
Apakah ada cara untuk menentukan atribut mana yang menghasilkan hasil? Saya mencari koleksi model kustom di tiga bidang ( name, altnernate_name, description) dan ingin tahu kapan hasilnya adalah karena descriptionatribut.
pspahn
4

Jika Anda ingin memasukkan DAN dengan kombinasi OR maka

$colemanManufacturerSku = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('sku_1')
    ->addAttributeToSelect('sku_2')
    ->addAttributeToSelect('sku_3')
    ->addAttributeToFilter('type_id', array('eq' => 'simple'))
    // Above condition will AND with following OR
    ->addAttributeToFilter(
        array(
            array(
                'attribute' => 'sku_1',
                'neq' => ''
            ),
            array(
                'attribute' => 'sku_2',
                'neq' => ''
            ),
            array(
                'attribute' => 'sku_3',
                'neq' => ''
            )
        )
    );
Hassan Ali Shahzad
sumber
2
+1 untuk solusi Anda, tetapi saya perlu persis sebaliknya, yaitu DIMANA (CONDITION_1 Dan CONDITION_2) ATAU (CONDITION_3 AND CONDITION_4))), Dapatkah Anda membantu
Haris
1

Atau syarat menggunakan addFieldToFilter


$collection->addFieldToFilter
                (   
                    array('email','mobile'),
                    array($emaiId,$mobNum)
                );

vitt
sumber