Magento:获取按属性过滤的产品集合的订单项集合

Lai*_*zer 6 sql zend-framework magento

我正在为Magento(1.6)商店开发一个类别汇总报告.

为此,我希望获得一个产品子集的订单项集合 - 那些唯一类别ID(我创建的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'));
Run Code Online (Sandbox Code Playgroud)

Magento不喜欢它,因为同一产品ID有重复的条目.

如何根据订单商品制作代码以获得此结果集?加入由属性过滤的产品集合是我的想法.这段代码没有做到这一点,因为它假设属性在Order Item上,而不是Product.

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

任何帮助表示赞赏.

Vin*_*nai 8

使交叉实体选择干净有效地工作的唯一方法是使用集合选择对象构建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);
Run Code Online (Sandbox Code Playgroud)

这对我很有用.由于性能原因,我倾向于跳过加入eav_entity_type表的完整方式eav_attribute,然后是值表等.由于attribute_id是特定于实体,所以这就是所需要的.
根据属性的范围,您可能还需要在商店ID中添加.