【问题标题】:Magento: Get Collection of Order Items for a product collection filtered by an attributeMagento:获取按属性过滤的产品集合的订单项目集合
【发布时间】:2012-03-05 21:01:09
【问题描述】:

我正在为 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 有重复的条目。

如何编写代码以根据订单项获取此结果集?加入按属性过滤的产品集合让我望而却步。这段代码没有起到作用,因为它假定属性在订单项上,而不是在产品上。

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

感谢任何帮助。

【问题讨论】:

    标签: sql zend-framework magento


    【解决方案1】:

    使跨实体选择干净有效地工作的唯一方法是使用集合选择对象构建 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 中添加。

    【讨论】:

    • 我如何也可以使用此代码加入 sales/order_grid_collection
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多