Jak określić niestandardową kolejność sortowania dla kolekcji produktów?


12

Próbuję utworzyć kolekcję produktów na podstawie tablicy identyfikatorów produktów, a także posortować kolekcję na podstawie tablicy identyfikatorów.

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

Chcę sortować zebrane tak, jak pojawiają się w $productIdstablicy, która jest, 318, 310, 311ale powyżej kodu zwróci sortowanie kolekcji jak 310,311, 312.

Czy jest to możliwe bez użycia zwykłego zapytania MySQL, jak podano poniżej?

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

Odpowiedzi:


18

Niestety Magento sprawdzi opcje zamówienia w Varien_Data_Collection_Db _setOrderfunkcji. Możesz jednak wybrać kolekcję i dodać nowe wyrażenie, aby zbudować porządek według własnego uznania.

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

W tym miejscu powinieneś zobaczyć, że identyfikatory produktów są uporządkowane w tablicy.


To działa! Dziękuję Ci. Czy możemy połączyć sortowanie według SKU do powyższego?
Tahir Yasin

Możesz dodać wiele pól do tego zamówienia przez składnięFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.