2012-04-23 16 views
5

Tworzę raport giełdowy w panelu administracyjnym i mam wszystko, co do tej pory działa, z tym wyjątkiem, że nie mogę filtrować na połączonej kolumnie.Filtrowanie połączonej kolumny

Dołączyłem do informacji o akcjach, korzystając z poniższego, aby pobrać moją kolekcję.

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

Powoduje wyświetlenie, ale nie można filtrować ani sortować kolumny. Zakładam, że opcje nie są przekazywane z powrotem do przyłączenia. Jednak pozostałe kolumny można sortować i filtrować, a pasujące dane są odciągane i wyświetlane.

Szukałem, ale większość postów znajduje się na forach Magento od 2008 roku i używam wersji 1.6! Wszelkie wskazówki byłyby świetne!

Odpowiedz

11

Po przyłączyć, trzeba dodać pole dołączył do tablicy _map zadeklarowanej w Varien_Data_Collection_Db, na przykład:

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

[edytuj] Jak podkreślił @ sh4dydud3_88, można to zrobić:

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

który doda pole stock_qty do filtrowania. Następnie można filtrować z

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

Inny przykład:

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

nie mogę sprawdzić, czy to działa, jak nie jestem praca nad tym projektem. –

+2

Działa, ale ponieważ nie rozszerzałem Mage_Core_Model_Resource_Db_Collection_Abstract '_map ['fields']' było prywatne/chronione. addFilterToMap załatwił sprawę. '$ collection-> addFilterToMap ('ihe_name', 'ihe.name');' –

+0

'' 'addFieldToMap''' w rzeczywistości jest poprawnym sposobem. '' '$ this -> _ map ['fields']' '' faktycznie nadpisuje wyjście z tablicy '' '_map''', więc staje się nieporęczne, jeśli mamy więcej niż jedną kolumnę do mapowania. – kiatng

0

Po dołączyć wystarczy użyć kolejności uporządkować swój wynik

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