Ürün toplama için özel sıralama düzeni nasıl belirlenir?


12

Ben ürün kimlikleri dizisine dayalı bir ürün koleksiyonu oluşturmaya çalışıyorum ve ayrıca kimlikleri dizisine göre koleksiyonu sıralamak.

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

Onlar $productIdsdizide göründüğü gibi toplanan sıralamak istiyorum 318, 310, 311ama yukarıdaki kod gibi toplama sıralama dönecektir 310,311, 312.

Bu, aşağıda belirtildiği gibi düz MySQL sorgusu kullanılmadan mümkün müdür?

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

Yanıtlar:


18

Maalesef Magento Varien_Data_Collection_Db _setOrderişlevdeki sipariş seçeneklerini doğrulayacak . Ancak koleksiyonun seçimini alabilir ve siparişi istediğiniz gibi oluşturmak için yeni bir ifade ekleyebilirsiniz.

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

Burada, ürün kimliklerinin dizinin sırasına göre olduğunu görmeniz gerekir.


İşe yarıyor! Teşekkür ederim. Sıralamayı SKU ile yukarı birleştirebilir miyiz?
Tahir Yasin

Sözdizimi ile bu siparişe birden çok alan ekleyebilirsinizFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.