2012-02-14 21 views
6

Estoy trabajando en el desarrollo de un informe de categoría para una tienda Magento (1.6).Magento: Obtener colección de artículos de pedido para una colección de productos filtrada por un atributo

Para este fin, quiero obtener una colección de Artículo de pedido para un subconjunto de productos, aquellos productos cuya identificación de categoría única (que es un atributo de producto Magento que creé) concuerdan con un valor particular.

Puedo obtener el resultado relevante establecido al basar la colección en el catálogo/producto.

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

A Magento no le gusta, ya que hay entradas duplicadas para la misma ID de producto.

¿Cómo se crea el código para obtener este conjunto de resultados en función de los elementos del pedido? Entrar en la colección de productos filtrada por un atributo me está eludiendo. Este código no está haciendo el truco, ya que supone que el atributo está en el Artículo de pedido, y no en el Producto.

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

Se agradece cualquier ayuda.

Respuesta

7

La única forma de hacer que la entidad cruzada seleccione el trabajo limpia y eficientemente es creando el SQL con el objeto de selección de colecciones.

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

Esto funciona bastante bien para mí. Tiendo a saltear todo el camino para unirme a la tabla eav_entity_type, luego a eav_attribute, luego a la tabla de valores, etc., por motivos de rendimiento. Como el attribute_id es específico de la entidad, eso es todo lo que se necesita.
Dependiendo del alcance de su atributo, es posible que también necesite agregar el ID de la tienda.

+0

Brilliant! Gracias. – Laizer

+0

¿Cómo puedo unirme a sales/order_grid_collection con este código? –

Cuestiones relacionadas