Magento: Получить коллекцию элементов заказа для коллекции продуктов, отфильтрованных по атрибуту - PullRequest
6 голосов
/ 14 февраля 2012

Я работаю над созданием сводного отчета по категориям для магазина Magento (1.6).

Для этого я хочу получить коллекцию Order Item для подмножества продуктов - тех продуктов, чей уникальный идентификатор категории (это созданный мной атрибут продукта 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 не нравится, так как для одного и того же идентификатора продукта есть повторяющиеся записи.

Как создать код для получения этого набора результатов на основе позиций заказа? Присоединение к коллекции товаров, отфильтрованных по атрибуту, ускользает от меня. Этот код не работает, так как предполагает, что атрибут находится в позиции заказа, а не в продукте.

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

Любая помощь приветствуется.

1 Ответ

8 голосов
/ 14 февраля 2012

Единственный способ заставить кросс-выборочные операции работать чисто и эффективно - это построить 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 является специфичным для сущности, это все, что нужно.
В зависимости от области действия вашего атрибута вам также может понадобиться добавить идентификатор магазина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...