2012-02-14 10 views
6

Pracuję nad opracowaniem raportu podsumowującego kategorię dla sklepu Magento (1.6).Magento: Pobierz kolekcję elementów zamówienia dla kolekcji produktów filtrowanych według atrybutu

W tym celu chcę uzyskać kolekcję Element zamówienia dla podzbioru produktów - produktów, których unikalny identyfikator kategorii (czyli utworzony przeze mnie atrybut produktu Magento) jest zgodny z określoną wartością.

Mogę uzyskać odpowiedni zestaw wyników, opierając kolekcję na katalogu/produkcie.

$collection = Mage::getModel('catalog/product') 
->getCollection() 
->addAttributeToFilter('unique_category_id', '75') 
->joinTable('sales/order_item', 'product_id=entity_id', array('price'=>'price','qty_ordered' => 'qty_ordered')); 

Magento tego nie lubi, ponieważ istnieją duplikaty wpisów dla tego samego identyfikatora produktu.

Jak utworzyć kod, aby uzyskać ten zestaw wyników na podstawie pozycji zamówienia? Łączenie się w kolekcji produktów filtrowanej przez atrybut umyka mi. Ten kod się nie sprawdza, ponieważ zakłada, że ​​atrybut znajduje się w elemencie zamówienia, a nie w produkcie.

$collection = Mage::getModel('sales/order_item') 
->getCollection() 
->join('catalog/product', 'entity_id=product_id') 
->addAttributeToFilter('unique_category_id', '75'); 

Każda pomoc jest doceniana.

Odpowiedz

7

Jedynym sposobem na sprawdzenie, czy obiekt crossowy działa, jest czyszczenie i efektywne, poprzez budowanie kodu SQL z obiektem wyboru kolekcji.

$attributeCode = 'unique_category_id'; 
$alias = $attributeCode.'_table'; 
$attribute = Mage::getSingleton('eav/config') 
    ->getAttribute(Mage_Catalog_Model_Product::ENTITY, $attributeCode); 

$collection = Mage::getResourceModel('sales/order_item_collection'); 
$select = $collection->getSelect()->join(
    array($alias => $attribute->getBackendTable()), 
    "main_table.product_id = $alias.entity_id AND $alias.attribute_id={$attribute->getId()}", 
    array($attributeCode => 'value') 
) 
->where("$alias.value=?", 75); 

Działa to całkiem dobrze dla mnie. Mam tendencję do pomijania pełnego sposobu dołączania do tabeli eav_entity_type, następnie eav_attribute, następnie tabeli wartości itp. Ze względu na wydajność. Ponieważ attribute_id jest specyficzna dla jednostki, to wszystko, co jest potrzebne.
W zależności od zakresu twojego atrybutu konieczne może być dodanie również identyfikatora sklepu.

+0

Genialny! Dziękuję Ci. – Laizer

+0

Jak mogę również dołączyć do sprzedaży/order_grid_collection tym kodem –

Powiązane problemy