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

时间:2012-02-14 13:36:13

标签: sql zend-framework magento

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

为此,我希望获得一个产品子集的Order Item集合 - 那些唯一类别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'));

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

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

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

感谢任何帮助。

1 个答案:

答案 0 :(得分: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中添加。