Magento: объединить эквалайзер и пусто в addAttributeToFilter - PullRequest
6 голосов
/ 06 сентября 2011

Я хочу объединить с ИЛИ "is null" и "eq" => array ()

$collection->addAttributeToFilter('attributename', array('is' => null));
$collection->addAttributeToFilter('attributename', array(115,116));

Но это не работает.

Ответы [ 3 ]

12 голосов
/ 06 сентября 2011

Чтобы использовать addAttributeToFilter() с условием OR, вы можете передать массив массивов следующим образом:

$collection->addAttributeToFilter(
    array(
        array(
            'attribute' => 'name_of_attribute_1',
            'null' => 'this_value_doesnt_matter'
        ),
        array(
            'attribute' => 'name_of_attribute_2',
            'in' => array(115, 116)
        )
    )
);

Определение фильтрации по ключевым словам NULL на первый взгляд может показаться несколько запутанным, но, как только вы к нему привыкнете, все просто.

Magento поддерживает два типа фильтров типа string, а именно 'null' и 'notnull', для сравнения с ключевыми словами NULL.

Имейте в виду, что даже если вам нужно передать пары ключ => (поскольку используется ассоциативный массив), значение будет всегда игнорироваться при использовании типа фильтра 'null' или 'notnull'.

Пример

var_dump(
    Mage::getModel('catalog/product')
    ->getCollection()
    ->addFieldToFilter(
        array(
            array(
                'attribute' => 'description',
                'null' => 'this_value_doesnt_matter'
            ),
            array(
                'attribute' => 'sku',
                'in' => array(115, 116)
            )
         )
     )
     ->getSelectSql(true)
 );

Вывод дампа может варьироваться в зависимости от конфигурации вашего магазина (идентификаторы атрибутов, количество магазинов и т. Д.), Но логика OR в предложении WHERE всегда должна оставаться неизменной:

SELECT 
    `e`.*,
    IFNULL(_table_description.value, _table_description_default.value) AS `description`
FROM
    `catalog_product_entity` AS `e`
INNER JOIN
    `catalog_product_entity_text` AS `_table_description_default` ON
    (_table_description_default.entity_id = e.entity_id) AND
    (_table_description_default.attribute_id='57') AND
    _table_description_default.store_id=0
LEFT JOIN
    `catalog_product_entity_text` AS `_table_description` ON
    (_table_description.entity_id = e.entity_id) AND
    (_table_description.attribute_id='57') AND
    (_table_description.store_id='1')
WHERE (
    (IFNULL(_table_description.value, _table_description_default.value) is NULL) OR
    (e.sku in (115, 116))
)
0 голосов
/ 12 января 2018
  • У меня есть атрибут продукта is_expired со значением Да и Нет, и я хочу, чтобы только те продукты имели значение НЕТ. Ниже для меня работает запрос, который получает запись с neq 1 и не нулевым.

    • Объединить не равно и нулевое условие С ИЛИ.

       $collection->addAttributeToFilter('attribue_name', array('or'=> array(
           0 => array( 'neq' => '1'),
           1 => array('is' => new Zend_Db_Expr('null')))
       ), 'left');
      
  • Вы можете изменить neq с помощью eq.

0 голосов
/ 11 февраля 2016

Чтобы использовать addAttributeToFilter с условием ИЛИ и левым соединением , вы можете сделать что-то подобное:

$collection->addAttributeToFilter(
    array(
        array('attribute' => 'name_of_attribute_1','null' => 'this_value_doesnt_matter'),
        array('attribute' => 'name_of_attribute_2','in' => array(115, 116))
        )
     '',
    'left'
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...