2012-02-14 11 views
6

Magento(1.6)ストアのカテゴリロールアップレポートの開発に取り組んでいます。Magento:属性でフィルタリングされた製品コレクションのオーダーアイテムのコレクションを取得

この目的のために、独自のカテゴリID(作成したMagento製品の属性)が特定の値と一致する製品のサブセットのOrder Itemコレクションを取得したいと考えています。

カタログ/製品に基づいて関連する結果セットを得ることができます。

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

助けてください。

答えて

7

クロスエンティティの選択作業をきれいに効率よく行う唯一の方法は、コレクションselectオブジェクトを使用して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

Brilliant!ありがとうございました。 – Laizer

+0

このコードでsales/order_grid_collectionに参加するにはどうすればよいですか –

関連する問題