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.