我想与OR结合使用“is null”和“eq”=>阵列()
$collection->addAttributeToFilter('attributename', array('is' => null));
$collection->addAttributeToFilter('attributename', array(115,116));
但这不起作用。
答案 0 :(得分:12)
要使用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
个关键字进行比较。
请注意,即使您需要传递key =>值对(因为使用了关联数组),当过滤器类型'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)
);
转储的输出可能因商店配置(属性ID,商店数量等)而异,但OR
子句中的WHERE
逻辑应始终保持不变:< / p>
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))
)
答案 1 :(得分:0)
我的产品属性is_expired
带有“是”和“否”值,我只想要那些产品没有值。对我来说,查询工作得到neq 1而非null的记录。
将OR不等于和null条件。
$collection->addAttributeToFilter('attribue_name', array('or'=> array(
0 => array( 'neq' => '1'),
1 => array('is' => new Zend_Db_Expr('null')))
), 'left');
您可以使用neq
更改eq
。
答案 2 :(得分:-1)
将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))
)
'',
'left'
);