2012-04-23 28 views
5

我在管理員中創建了一個股票報告,並讓所有工作都到目前爲止,除了我似乎無法對聯接列進行篩選。篩選加入的列

我已加入股票信息,使用以下來獲取我的收藏。

$collection = Mage::getModel('catalog/product')->getCollection() 
       ->addAttributeToSelect('name') 
       ->addAttributeToSelect('sku') 
       ->addAttributeToSelect('price') 
       ->setStoreId($storeId); 
$collection->addFieldToFilter('type_id', 'simple'); 

// Add on the stock qty information 
$collection->getSelect()->join(array('stock'=>'ccmg_cataloginventory_stock_item'), 'e.entity_id = stock.item_id', array('stock.qty')); 

這導致它顯示,但不能篩選或排序列。我假設因爲這些選項沒有被傳遞迴聯接。但是,可以對其他列進行排序和過濾,並將匹配的數據撤回並顯示。

我一直在尋找,但大多數帖子都是在2008年的Magento論壇上,我使用的是1.6!任何指針都會很棒!

回答

11

的連接後,您需要將聯接字段添加到Varien_Data_Collection_Db聲明數組_map,例如:

$this->_map['fields']['stock_qty'] = 'stock.qty'; 

[編輯]正如@ sh4dydud3_88指出的那樣,你可以這樣做:

$collection->addFilterToMap('stock_qty', 'stock.qty'); 

這將增加該領域stock_qty用於濾波。然後,你可以用

$collection->addFieldToFilter('stock_qty', array('gt', 10)); 

過濾又如:

class Company_Mohe_Model_Resource_Im_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract 
{ 
protected function _construct() 
{ 
    $this->_init('mohe/im'); 
} 


public function joinIhe() 
{ 
    $this->getSelect()->join(array('ihe' => $this->getTable('mohe/ihe')), 
            'main_table.mic_inst_id = ihe.im_id', 
            array('ihe_name'=>'name', 'ihe_ifms_id'=>'ifms_id')); 
    //$this->_map['fields'] = array('ihe_name'=>'ihe.name', 'ihe_ifms_id'=>'ihe.ifms_id'); //incorrect method 
    $this->addFilterToMap('ihe_name', 'ihe.name'); //correct method, see comment by @sh4dydud3_88       
    return $this; 
} 
} 
+0

我無法驗證,如果這個工程因爲我不再一次在這個項目上工作。 – 2013-04-08 09:48:46

+2

它的作品,但由於我沒有擴展Mage_Core_Model_Resource_Db_Collection_Abstract'_map ['fields']'是私人/保護。 addFilterToMap做了訣竅。 '$ collection-> addFilterToMap('ihe_name','ihe.name');' – 2013-07-23 08:09:31

+0

'''addFieldToMap'''實際上是正確的方法。 '''這個 - > _ map ['fields']'''實際上覆蓋了退出的'''_map'''數組,所以如果我們有多於一個的列映射就變得很麻煩。 – kiatng 2015-03-30 03:01:22

0

後加入簡單的使用順序排序的結果

$collection->getSelect() 
    ->join(array('stock'=>'ccmg_cataloginventory_stock_item'), 'e.entity_id = stock.item_id', array('stock.qty')) 
    ->order('stock.qty ASC');