これは、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();
ありがとう!私はそれを試してみましょう。 – Pini
クール。ちょうどFYIの最後の行 'echo $ collection-> getFirstItem() - > getCategoryName();'は、コレクション内の最初の項目をエコーアウトして、データ内のカテゴリ名を見る方法の例です。 –
テスト済みで正常に動作します。 もう一度@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