2012-02-14 100 views
6

我正在開發Magento(1.6)商店的分類彙總報表。Magento:獲取按屬性過濾的產品集合的訂單項集合

爲此,我希望爲產品子集獲得訂單項集合 - 這些產品的唯一類別標識(這是我創建的Magento產品屬性)與特定值匹配。

我可以根據目錄/產品的集合來獲得相關結果集。

$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不喜歡它,因爲有相同產品ID的重複條目。

如何製作代碼以基於訂單項獲取此結果集?加入由屬性過濾的產品集合正在逃避我。這段代碼並沒有做到這一點,因爲它假定屬性在Order Item上,而不是Product。

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

任何幫助表示讚賞。

回答

7

使交叉實體乾淨而高效地選擇工作的唯一方法是通過使用集合選擇對象構建SQL。

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

這對我來說很好。我傾向於跳過加入eav_entity_type表的完整方式,然後eav_attribute,然後出於性能原因值表等。由於attribute_id是實體特定的,這就是所需要的。
根據屬性的範圍,您可能還需要在商店ID中添加。

+0

太棒了!謝謝。 – Laizer 2012-02-14 15:50:41

+0

如何使用此代碼加入sales/order_grid_collection – 2014-01-29 11:31:03