2011-03-09 30 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