2012-09-19 31 views
0

我能够使用addFieldToFilter和addAttributeToFilter在Magento上运行AND和OR布尔条件。在Magento上加入条件OR条件

不过,我很好奇实施更复杂的布尔条件象下面这样:

WHERE (`sku > 5` AND `price` > '10') OR (`name` = 'books') 

为AND条件,我有

$collections = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*') 
->addFieldToFilter('sku', array('gt' => 5) 
->addFieldToFilter('price', array('gt' => 10); 

翻译为WHERE条件的第一个括号:

(`sku` > 5 AND `price` > 10) 

我不知道如何从这里开始表达OR条件

`name` = 'books' 

任何帮助将不胜感激。由于

回答

-1

见我先前的职位:

complex boolean conditions on Magento

您可以创建或通过传递一个数组:

Mage::getModel('catalog/product') 
->getCollection() 
->addFieldToFilter('price', array('gt' => 10)) 
->addAttributeToFilter(
    array(
     array('attribute'=>'firstname', 'like'=>'test%'), 
     array('attribute'=>'lastname', 'like'=>'test%'), 
    ) 
) 

到addAttributeToFilter每增加一个()的调用将相与,但名字/姓氏意志被“或”。

如果您需要更复杂的选择语句,您始终可以从集合中获取选择对象并对查询执行调整。看看Varien_Db_Select的提示:)

$collection->getSelect()->join(..)->orWhere(..); // etc 

你甚至可以调试查询,看看它看起来OK:

echo $collection->getSelect()->__toString(); 
+0

感谢安德鲁,但是这一次是不同的。我这次用括号强调我的观点:'在哪里(SKU> 5 AND价格> 10)或(名称=书籍)'。但是,根据你和他人的答案,我可以做的是哪里(sku> 5)和(价格> 10或名称='书籍'),这是一个不同的答案。 – Edville

+0

我看到了这个(和类似的)答案,但它并没有回答这个问题。 AND表达式位于括号内,OR位于另一个字段的OR位置。我发现的其他答案只提到了对同一字段的ORing不同的值。 –

+0

Varien_Db_Select正是我所需要的。再次感谢安德鲁。 – Edville