Мультиусловия (ИЛИ и И внутри И) в 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');

Спасибовведите описание изображения здесь

Andhi Irawan
источник
Я нашел это очень полезным: blog.chapagain.com.np/…
nicolallias

Ответы:

41

Вы должны быть в состоянии объединить большинство из этих методов, чтобы создать нужный запрос. Для таблиц продаж вы, вероятно, будете использовать addFieldToFilter- но Zend_Db_Expr, скорее всего, путь наименьшего сопротивления для вас:

addAttributeToFilter:

Согласно Magento Wiki : При создании круглых скобок, которые имеют ORусловия, вы можете сделать следующее:

Если массив передан, но код атрибута не указан, он будет интерпретирован как группа условий 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:

В случае, когда модель напрямую связана с таблицей БД, для применения условных выражений к столбцу базы данных по имени требуется следующее:

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

Zend_Db_Expr:

Для гораздо более сложных конструкций вы можете создать свой собственный оператор where 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

philwinkle
источник
Спасибо за ваш ответ, но я хочу, чтобы условие было таким: WHERE (CONDITION_1 ИЛИ (CONDITION_2 И (CONDITION_3 ИЛИ CONDITION_4))). Я уже разместил запрос, который я хочу выше.
Андхи Ираван
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, AND и OR: pastebin.com/ZznxLAai
Andhi Irawan
Есть ли способ определить, какой атрибут дал результат? Я ищу коллекцию пользовательских моделей по трем направлениям ( name, altnernate_name, description) и хотел бы знать , когда результат из - за descriptionатрибута.
pspahn
4

Если вы хотите включить И с комбинацией ИЛИ, то

$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 за ваше решение, но мне нужно с точностью до наоборот, т.е. ГДЕ (СОСТОЯНИЕ_1 И СОСТОЯНИЕ_2) ИЛИ (СОСТОЯНИЕ_3 И СОСТОЯНИЕ_4))), не могли бы вы помочь
Харис
1

Или условие, используя addFieldToFilter


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

vitts
источник