Чтобы использовать 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))
)