Làm thế nào để xác định thứ tự sắp xếp tùy chỉnh cho bộ sưu tập sản phẩm?


12

Tôi đang cố gắng tạo ra một bộ sưu tập sản phẩm dựa trên mảng id sản phẩm và cũng sắp xếp bộ sưu tập dựa trên mảng ids.

$productIds = array(318,310,311);
$collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->setOrder('entity_id', 'asc') // This will not do the job
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('entity_id', array(
    'in' => $productIds,
        ));

Tôi muốn sắp xếp được thu thập khi chúng xuất hiện trong $productIdsmảng đó 318, 310, 311nhưng mã ở trên sẽ trả về sắp xếp bộ sưu tập như thế nào 310,311, 312.

Điều này có thể thực hiện được mà không cần sử dụng truy vấn MySQL đơn giản như được đưa ra dưới đây?

SELECT *
FROM catalog_product_entity
WHERE entity_id IN (318,
                    310,
                    311)
ORDER BY FIELD(entity_id, 318, 310, 311);

Câu trả lời:


18

Đáng buồn là Magento sẽ xác nhận các tùy chọn thứ tự trong Varien_Data_Collection_Db _setOrderchức năng. Nhưng bạn có thể chọn bộ sưu tập và thêm một biểu thức mới để tạo thứ tự theo ý muốn.

/* @var $collection Mage_Catalog_Model_Resource_Product_Collection */
$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('status', 1)
    ->addAttributeToFilter('entity_id', array(
            'in' => $productIds,
        ));

$collection->getSelect()->order(new Zend_Db_Expr('FIELD(e.entity_id, ' . implode(',', $productIds).')'));

foreach($collection as $product) {
    var_dump($product->getId());
}

Ở đây bạn sẽ thấy rằng các id sản phẩm theo thứ tự của mảng.


Nó hoạt động! Cảm ơn bạn. Chúng ta có thể kết hợp sắp xếp theo SKU ở trên không?
Tahir Yasin

Bạn có thể thêm nhiều trường vào thứ tự này theo cú phápFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.