AddAttributeToFilter içindeki Çok Koşullu (VEYA ve VE içinde VE)


19

AddAttributeToFilter'da çok koşullu nasıl oluşturulur?

Bunun gibi bir SQL sorgusu sonuç (görüntü ekli) istiyorum:

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

teşekkür ederimresim açıklamasını buraya girin


Bunu çok faydalı buldum: blog.chapagain.com.np/…
nicolallias

Yanıtlar:


41

İstediğiniz sorguyu oluşturmak için bu tekniklerin çoğunu birleştirebilmeniz gerekir. Satış tabloları için muhtemelen kullanacaksınız addFieldToFilter- ancak Zend_Db_Exprmuhtemelen sizin için en az direnç yolu:

addAttributeToFilter:

Magento Wiki'ye göre : Koşulları olan parantez oluştururken ORaşağıdakileri yapabilirsiniz:

Bir dizi iletilir ancak hiçbir özellik kodu belirtilmezse, aynı şekilde işlenecek bir OR koşulu grubu olarak yorumlanır.

Böylece, aşağıdakileri inşa edebiliriz:

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

Bu irade çıkışı WHEREformatının fıkra:

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

addFieldToFilter:

Modelin doğrudan bir DB tablosuna bağlı olması durumunda, koşulları veritabanı sütununa ada göre uygulamak için aşağıdakiler gereklidir:

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

Zend_Db_Expr:

Çok daha karmaşık yapılar için kendi cümleleri kullanarak kendi inşa edebilirsiniz Zend_Db_Expr. Örneğin :

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

Kaynak :

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

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


Cevabınız için teşekkürler, ancak istediğim şey şunun gibi bir koşul oluşturmak: NEREDE (CONDITION_1 VEYA (CONDITION_2 VE (CONDITION_3 VEYA CONDITION_4))). Yukarıda istediğim sorguyu zaten gönderiyorum.
Andhi Irawan

1
Ben kullanabileceğiniz bir noktaya geldi düşündüm Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle

Cevabınız için teşekkürler philwinkle.base, bu addAttributeToFilter ve AND ve OR ile yaptığım örnek: pastebin.com/ZznxLAai
Andhi Irawan

Hangi özelliğin sonuç ürettiğini belirlemenin bir yolu var mı? Üç alanları arasında özel bir modeli koleksiyon arıyorum ( name, altnernate_name, description) ve bir sonuç nedeniyle olduğunda bilmek istiyorum descriptionözniteliği.
pspahn

4

Eğer eklemek istiyorsanız VE kombinasyonu ile VEYA sonra

$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
Çözümünüz için +1, ancak tam tersine ihtiyacım var, yani WHERE (CONDITION_1 ve CONDITION_2) VEYA (CONDITION_3 AND CONDITION_4))), Lütfen yardım edebilir misin
Haris

1

Veya addFieldToFilter kullanarak koşullandırma


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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.