Bagaimana cara menentukan pesanan penyortiran khusus untuk koleksi produk?

12

Saya mencoba membuat koleksi produk berdasarkan array id produk, dan juga mengurutkan koleksi berdasarkan array id.

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

Saya ingin mengurutkan dikumpulkan karena mereka muncul dalam $productIdsarray yang 318, 310, 311tetapi kode di atas akan mengembalikan semacam koleksi seperti 310,311, 312.

Apakah ini mungkin tanpa menggunakan permintaan MySQL biasa seperti yang diberikan di bawah ini?

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

Jawaban:

18

Sayangnya Magento akan memvalidasi opsi pesanan dalam Varien_Data_Collection_Db _setOrderfungsi. Tetapi Anda dapat memilih koleksi dan menambahkan ekspresi baru untuk membangun pesanan sesuka Anda.

/* @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());
}

Di sini Anda akan melihat bahwa id produk berada dalam urutan array.

David Manners
sumber
Berhasil! Terima kasih. Bisakah kita menggabungkan urutkan berdasarkan SKU ke atas?
Tahir Yasin
Anda dapat menambahkan beberapa bidang ke pesanan ini dengan sintaksFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners