2012-02-14 71 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