Đa điều kiện (HOẶC và VÀ bên trong AND) trong addAttributionToFilter


19

Làm cách nào để tạo nhiều điều kiện trong addAttributionToFilter?

Tôi muốn kết quả trong một truy vấn SQL như thế này (hình ảnh đính kèm):

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

Cảm ơn bạnnhập mô tả hình ảnh ở đây


Tôi thấy điều này rất hữu ích: blog.chapagain.com.np/ Kẻ
nicolallias

Câu trả lời:


41

Bạn sẽ có thể kết hợp hầu hết các kỹ thuật này để tạo truy vấn bạn muốn. Đối với các bảng doanh số, có thể bạn sẽ sử dụng addFieldToFilter- nhưng Zend_Db_Exprcó thể là con đường ít kháng cự nhất đối với bạn:

addAttributionToFilter:

Theo Magento Wiki : Khi tạo các ngoặc đơn có ORđiều kiện, bạn có thể làm như sau:

Nếu một mảng được thông qua nhưng không có mã thuộc tính được chỉ định, nó sẽ được hiểu là một nhóm các điều kiện OR sẽ được xử lý theo cùng một cách.

Vì vậy, từ đó chúng ta có thể xây dựng như sau:

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

Điều này sẽ xuất ra một WHEREmệnh đề của định dạng:

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

addFieldToFilter:

Trong trường hợp mô hình được liên kết trực tiếp với bảng DB, thì cần có các điều kiện sau để áp dụng các điều kiện cho cột cơ sở dữ liệu theo tên:

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

Zend_Db_Expr:

Đối với các cấu trúc phức tạp hơn nhiều, bạn có thể xây dựng mệnh đề where của riêng mình bằng cách sử dụng Zend_Db_Expr. Ví dụ :

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

Nguồn:

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

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


Cảm ơn câu trả lời của bạn, nhưng điều tôi muốn là đưa ra các điều kiện như: WHERE (CONDITION_1 HOẶC (CONDITION_2 VÀ (CONDITION_3 HOẶC CONDITION_4))). Tôi đã đăng truy vấn mà tôi muốn ở trên.
Andhi I Girls

1
Tôi nghĩ rằng tôi đã đưa ra quan điểm mà bạn có thể sử dụng Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle

cảm ơn philwinkle.base về câu trả lời của bạn, đây là ví dụ mẫu tôi đã làm với addAttributionToFilter và điều kiện AND và OR: pastebin.com/ZznxLAai
Andhi I Girls

Có cách nào để xác định thuộc tính nào tạo ra kết quả không? Tôi đang tìm kiếm một bộ sưu tập mô hình tùy chỉnh trên ba lĩnh vực ( name, altnernate_name, description) và muốn biết khi nào kết quả là vì các descriptionthuộc tính.
pspahn

4

Nếu bạn muốn bao gồm AND với sự kết hợp của OR thì

$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 cho giải pháp của bạn, nhưng tôi cần hoàn toàn ngược lại, ví dụ WHERE (CONDITION_1 và CONDITION_2) HOẶC (CONDITION_3 VÀ CONDITION_4))), bạn có thể vui lòng giúp đỡ
Haris

1

Hoặc điều kiện sử dụng addFieldToFilter


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

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.