¿Cómo especificar un orden de clasificación personalizado para la colección de productos?

12

Estoy tratando de crear una colección de productos basada en la matriz de identificadores de productos, y también ordenar la colección basada en la matriz de identificadores.

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

Quiero ordenar los recopilados tal como aparecen en la $productIdsmatriz, 318, 310, 311pero el código anterior devolverá el tipo de colección como 310,311, 312.

¿Es esto posible sin usar la consulta MySQL simple como se muestra a continuación?

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

Respuestas:

18

Lamentablemente, Magento validará las opciones de pedido en Varien_Data_Collection_Db _setOrderfunción. Pero puede obtener la selección de la colección y agregar una nueva expresión para crear el orden que desee.

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

Aquí debería ver que los identificadores del producto están en el orden de la matriz.

David modales
fuente
¡Funciona! Gracias. ¿Podemos combinar ordenar por SKU a arriba?
Tahir Yasin
Puede agregar múltiples campos a este orden por la sintaxisFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners