Wie kann ich eine benutzerdefinierte Sortierreihenfolge für die Produktabholung festlegen?


12

Ich versuche, eine Produktsammlung basierend auf einem Array von Produkt-IDs zu erstellen und die Sammlung auch basierend auf dem Array von IDs zu sortieren.

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

Ich möchte gesammelt sortieren, wie sie im $productIdsArray angezeigt werden, 318, 310, 311aber der obige Code gibt eine Sammlungssortierung wie zurück 310,311, 312.

Ist dies möglich, ohne eine einfache MySQL-Abfrage wie unten angegeben zu verwenden?

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

Antworten:


18

Leider wird Magento die Bestelloptionen in Varien_Data_Collection_Db _setOrderFunktion validieren . Sie können jedoch die Auswahl der Sammlung treffen und einen neuen Ausdruck hinzufügen, um die Reihenfolge nach Ihren Wünschen zu erstellen.

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

Hier sollten Sie sehen, dass sich die Produkt-IDs in der Reihenfolge des Arrays befinden.


Es klappt! Vielen Dank. Können wir die Sortierung nach Artikelnummer bis oben kombinieren?
— Tahir Yasin

Sie können durch die Syntax mehrere Felder zu dieser Bestellung hinzufügenFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
— David Manners
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.