2016-05-15 4 views
1

catalog/category属性の一部をsales/order_itemコレクションに左結合しようとしています。Magento: 'catalog/category'フィールドを 'sales/order_item'コレクションにどのようにLEFT-JOINするのですか?

例: aを満たすと、注文アイテムデータにカテゴリ名が追加されます。

  • 私はフラットテーブルのカテゴリを使用できますが、EAVコレクションに参加することができるかどうかを知る必要があります。
  • これは、1つのmysqlクエリで行う必要があります(注文アイテムなどをループしないで...)
  • 商品にカテゴリが2つ以上ある場合は、重複行が発生する可能性があります私は何が必要です。

ありがとうございます!

答えて

2

これは、Magentoの世界でこれを行う方法です。コレクションの「グループ」に注意してください。これは、左結合の場合、同じ主キーに対して複数の結果がある場合、そのIDを持つ項目がすでに存在するというエラーがVarien_Data_Collectionによってスローされるためです。とにかく、私はあなたのためにこれを書いて、それをテストしました。

私の回答はカテゴリ名のストア値も取得し、ストア値が存在しない場合はデフォルト値に戻ります。

<?php 

include 'app/Mage.php'; 
Mage::app(); 

$itemModel   = Mage::getModel('sales/order_item'); 
$itemResource   = $itemModel->getResource(); 
$categoryProductTable = $itemResource->getTable('catalog/category_product'); 

$categoryModel = Mage::getModel('catalog/category'); 
$categoryResource = $categoryModel->getResource(); 
$name    = $categoryResource->getAttribute('name'); 
$nameTable  = $name->getBackendTable(); 
$defaultStoreId = Mage_Core_Model_App::ADMIN_STORE_ID; 

$collection = $itemModel->getCollection(); 
$collection->getSelect()->joinLeft(array('category_product_table' => $categoryProductTable), 'main_table.product_id = category_product_table.product_id', array()); 
$collection->getSelect()->joinLeft(array('store_category_name_table' => $nameTable), 
            "store_category_name_table.entity_id = category_product_table.category_id AND 
            store_category_name_table.attribute_id = {$name->getAttributeId()} AND 
            store_category_name_table.entity_type_id = {$name->getEntityTypeId()} AND 
            store_category_name_table.store_id = main_table.store_id", 
            array() 
); 
$collection->getSelect()->joinLeft(array('default_category_name_table' => $nameTable), 
            "default_category_name_table.entity_id = category_product_table.category_id AND 
            default_category_name_table.attribute_id = {$name->getAttributeId()} AND 
            default_category_name_table.entity_type_id = {$name->getEntityTypeId()} AND 
            default_category_name_table.store_id = {$defaultStoreId}", 
            array() 
); 
$collection->getSelect()->columns(array('category_name' => new Zend_Db_Expr('COALESCE(store_category_name_table.value,default_category_name_table.value)'))); 
$collection->getSelect()->group('main_table.item_id'); 

echo $collection->getFirstItem()->getCategoryName(); 
+0

ありがとう!私はそれを試してみましょう。 – Pini

+0

クール。ちょうどFYIの最後の行 'echo $ collection-> getFirstItem() - > getCategoryName();'は、コレクション内の最初の項目をエコーアウトして、データ内のカテゴリ名を見る方法の例です。 –

+0

テスト済みで正常に動作します。 もう一度@ShawnAbramson、あなたは私に多くの時間を節約しました。 Notes/Additions: 他の列でグループ化する必要がありましたので、 "$ collection-> getSelect() - > group( 'main_table.item_id');"を削除しました。 これは、「item is id is already exist ...」という既知のコレクションエラーにつながりました。これは、select列をリセットし、 'item_id'をエイリアスに置き換えて解決しました。 $ collection-> getSelect () - >リセット(Zend_Db_Select :: COLUMNS); $ collection-> getSelect() - >列(配列( 'order_item_id' => 'item_id')); – Pini

1

あなたは可能です。

$resource = Mage::getSingleton('core/resource'); 
$readConnection = $resource->getConnection('core_read'); 

$sql = 'SELECT `main_table`.*, `products`.*, `cname`.* FROM `sales_flat_order_item` AS `main_table` 
LEFT JOIN `catalog_category_product` AS `products` ON main_table.product_id=products.product_id 
LEFT JOIN `catalog_category_entity_varchar` AS `cname` ON `products`.`category_id`=`cname`.`entity_id` 
'; 

$result = $readConnection->fetchAll($sql); 
+0

私の答えをご覧ください。このデータを得るためにMagentoメソッドを実行する方がずっと信頼できます。 –

+0

@ShawnAbramson私はあなたに完全に同意します - よりよいアプローチはMagentos ORMを使用しています。 – codedge

関連する問題