Кілька Умов (АБО та І всередині І) в 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 : Під час створення дужок, які мають 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:

Для набагато складніших конструкцій ви можете створити свій власний, де використовується застереження 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 OR (CONDITION_2 AND (CONDITION_3 OR 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 та умовою 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 для вашого рішення, але мені потрібно якраз навпаки, тобто де (CONDITION_1 і CONDITION_2) АБО (CONDITION_3 AND CONDITION_4))), можете допомогти, будь ласка,
Haris

1

Або умова за допомогою addFieldToFilter


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.