2012-04-23 19 views
5

Sto creando un report stock nell'amministratore e ho tutto ciò che funziona finora, tranne che non riesco a filtrare sulla colonna unita.Filtraggio di una colonna congiunta

Ho unito le informazioni di borsa, utilizzando il seguente per afferrare la mia collezione.

$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')); 

Questo sta causando la visualizzazione, ma non è possibile filtrare o ordinare la colonna. Presumo perché le opzioni non vengono riconsegnate al join. Tuttavia, le altre colonne possono essere ordinate e filtrate e i dati corrispondenti vengono riportati indietro e visualizzati.

Ho cercato ma la maggior parte dei post sono presenti nei forum Magento dal 2008 e sto utilizzando 1.6! Qualsiasi suggerimento sarebbe grandioso!

risposta

11

Dopo il join, è necessario aggiungere il campo collegato alla matrice _map dichiarato nella Varien_Data_Collection_Db, ad esempio:

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

[modifica] Come sottolineato da @ sh4dydud3_88, si può fare questo:

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

che aggiungere il campo stock_qty per il filtraggio. Quindi è possibile filtrare con

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

Un altro esempio:

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

non posso verificare se questo funziona come io non sono lavorando ancora su questo progetto. –

+2

Funziona, ma poiché non stavo estendendo Mage_Core_Model_Resource_Db_Collection_Abstract '_map ['fields']' era privato/protetto. addFilterToMap ha fatto il trucco. '$ collection-> addFilterToMap ('ihe_name', 'ihe.name');' –

+0

'' 'addFieldToMap''' infatti è il modo corretto. '' '$ this -> _ map ['fields']' '' in realtà sovrascrive l'uscita '' '_map''' array, quindi diventa ingombrante se abbiamo più di una colonna da mappare. – kiatng

0

Dopo unirsi fine semplicemente utilizzare per ordinare il vostro risultato

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