2011-03-09 63 views
0


我想用分组子句过滤集合。在SQL中,会看起来像:Magento:使用分组子句过滤收藏集

SELECT * FROM `my_table` WHERE col1='x' AND (col2='y' OR col3='z') 

如何我“翻译”这与->addFieldToFilter(...)过滤收集?
谢谢!

回答

6

如果您收藏是一个EAV类型,那么这个效果很好:

$collection = Mage::getResourceModel('yourmodule/model_collection') 
    ->addAttributeToFilter('col1', 'x') 
    ->addAttributeToFilter(array(
     array('attribute'=>'col2', 'eq'=>'y'), 
     array('attribute'=>'col3', 'eq'=>'z'), 
    )); 

但是,如果你坚持一个平坦的桌面,我不认为addFieldToFilter作品完全一样的方式。一种选择是直接使用选择对象。

$collection = Mage::getResourceModel('yourmodule/model_collection') 
    ->addFieldToFilter('col1', 'x'); 
$collection->getSelect() 
    ->where('col2 = ?', 'y') 
    ->orWhere('col3 = ?', 'z'); 

但是,这是失败的运营商的顺序。你会得到像SELECT * FROM my_table WHERE (col1='x') AND (col2='y') OR (col3='z')这样的查询。该OR并不优先这里,绕过它意味着更加具体......

$collection = Mage::getResourceModel('yourmodule/model_collection') 
    ->addFieldToFilter('col1', 'x'); 
$select = $collection->getSelect(); 
$adapter = $select->getAdapter(); 
$select->where(sprintf('(col2 = %s) OR (col3 = %s)', $adapter->quote('x'), $adapter->quote('y'))); 

它是不安全的传递值未加引号的,这里的适配器被用来安全地说出来了。

最后,如果col2col3实际上是相同的,如果你的OR-ing一列中的值,那么你可以使用这个速记:

$collection = Mage::getResourceModel('yourmodule/model_collection') 
    ->addFieldToFilter('col1', 'x') 
    ->addFieldToFilter('col2', 'in'=>array('y', 'z')); 
+0

感谢clockworkgeek!因为'Mage :: getResourceModel('core/url_rewrite_collection')'代表了一个平坦的表格,我不得不采用“更具体”的方式:) – Jake 2011-03-09 13:24:58

+0

可惜收藏界面并不总是那么整洁。有时它最适合用于解决方案。 – clockworkgeek 2011-03-09 13:37:42