2012-02-14 28 views
6

Tôi đang nghiên cứu phát triển báo cáo danh mục cho một cửa hàng Magento (1.6).Magento: Nhận bộ sưu tập các mục đặt hàng cho một bộ sưu tập sản phẩm được lọc bởi thuộc tính

Để kết thúc, tôi muốn nhận bộ sưu tập Đơn đặt hàng cho một tập hợp con sản phẩm - sản phẩm có id danh mục duy nhất (đó là thuộc tính sản phẩm Magento mà tôi đã tạo) khớp với một giá trị cụ thể.

Tôi có thể nhận được tập hợp kết quả có liên quan bằng cách dựa vào bộ sưu tập trên danh mục/sản phẩm.

$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 không thích, vì có mục trùng lặp cho cùng một id sản phẩm.

Làm cách nào để tạo mã để có được tập hợp kết quả này dựa trên các mục đặt hàng? Việc tham gia vào bộ sưu tập sản phẩm được lọc bởi một thuộc tính đang loại bỏ tôi. Mã này không thực hiện thủ thuật, vì nó giả định rằng thuộc tính nằm trên Item Order, chứ không phải Product.

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

Mọi trợ giúp đều được đánh giá cao.

Trả lời

7

Cách duy nhất để thực hiện lựa chọn đối tượng chéo hoạt động một cách sạch sẽ và hiệu quả là bằng cách xây dựng SQL với đối tượng chọn bộ sưu tập.

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

Điều này làm việc khá tốt cho tôi. Tôi có xu hướng bỏ qua cách đầy đủ để tham gia bảng eav_entity_type, sau đó eav_attribute, sau đó là bảng giá trị v.v. vì lý do hiệu suất. Vì attribute_id là thực thể cụ thể, đó là tất cả những gì cần thiết.
Tùy thuộc vào phạm vi thuộc tính của bạn, bạn cũng có thể cần phải thêm vào id cửa hàng.

+0

Tuyệt vời! Cảm ơn bạn. – Laizer

+0

Làm cách nào để tôi cũng có thể tham gia bán hàng/order_grid_collection bằng mã này –

Các vấn đề liên quan