หลายเงื่อนไข (หรือและและภายในและ) ใน addAttributeToFilter


19

วิธีการสร้างหลายเงื่อนไขใน addAttributeToFilter

ฉันต้องการผลแบบสอบถาม SQL เช่นนี้ (ภาพที่แนบมา):

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');

ขอขอบคุณป้อนคำอธิบายรูปภาพที่นี่


ฉันพบสิ่งนี้มีประโยชน์มาก: blog.chapagain.com.np/…
nicolallias

คำตอบ:


41

คุณควรจะรวมเทคนิคเหล่านี้ส่วนใหญ่เพื่อสร้างแบบสอบถามที่คุณต้องการ สำหรับตารางการขายคุณอาจใช้addFieldToFilter- แต่Zend_Db_Exprมีแนวโน้มว่าจะมีความต้านทานน้อยที่สุดสำหรับคุณ:

addAttributeToFilter:

ตาม Magento Wiki : เมื่อสร้าง parentheticals ที่มีORเงื่อนไขคุณสามารถทำสิ่งต่อไปนี้:

หากมีการส่งผ่านอาร์เรย์ แต่ไม่มีการระบุรหัสแอททริบิวมันจะถูกตีความเป็นกลุ่มของเงื่อนไขหรือเงื่อนไขที่จะถูกประมวลผลในลักษณะเดียวกัน

ดังนั้นจากนั้นเราสามารถสร้างต่อไปนี้:

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

สิ่งนี้จะส่งส่วนWHEREคำสั่งของรูปแบบ:

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

addFieldToFilter:

ในกรณีที่โมเดลเชื่อมโยงโดยตรงกับตาราง DB จำเป็นต้องใช้สิ่งต่อไปนี้สำหรับการใช้เงื่อนไขกับคอลัมน์ฐานข้อมูลตามชื่อ:

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

Zend_Db_Expr:

Zend_Db_Exprสำหรับโครงสร้างที่ซับซ้อนมากขึ้นมากที่คุณสามารถสร้างของคุณเองข้อที่ใช้ ตัวอย่างเช่น

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

ที่มา:

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

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


ขอขอบคุณสำหรับการตอบกลับของคุณ แต่สิ่งที่ฉันต้องการคือให้มีเงื่อนไขเช่น: WHERE (CONDITION_1 หรือ (CONDITION_2 และ (CONDITION_3 หรือ CONDITION_4)) ฉันโพสต์คำถามที่ฉันต้องการไปแล้ว
Andhi Irawan

1
ฉันคิดว่าฉันทำประเด็นที่คุณสามารถใช้Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle

ขอบคุณ philwinkle.base ในคำตอบของคุณนี่คือตัวอย่างสิ่งที่ฉันทำกับ addAttributeToFilter และและและและหรือเงื่อนไข: pastebin.com/ZznxLAai
Andhi Irawan

มีวิธีการตรวจสอบคุณลักษณะที่ผลิตผลลัพธ์หรือไม่ ฉันกำลังค้นหารูปแบบการเก็บที่กำหนดเองทั่วทั้งสามสาขา ( name, altnernate_name, description) และต้องการที่จะรู้ว่าเมื่อผลเป็นเพราะdescriptionแอตทริบิวต์
pspahn

4

หากคุณต้องการรวมและด้วยการรวมกันของORแล้ว

$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' => ''
            )
        )
    );

2
+1 สำหรับวิธีการแก้ปัญหาของคุณ แต่ฉันต้องการสิ่งที่ตรงกันข้ามเช่น WHERE (CONDITION_1 และ CONDITION_2) หรือ (CONDITION_3 และ CONDITION_4))) คุณช่วยได้ไหม
Haris

1

หรือเงื่อนไขโดยใช้ addFieldToFilter


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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.