Pregunta

Estoy intentando ordenar una colección de productos por SKU según el orden en que aparecen los SKU en la matriz $skus pasada al método addAttributeToFilter en la siguiente colección:

    $skus = explode(",",$this->getRequest()->getParam('skus'));

    $collection = Mage::getModel('catalog/product')->getCollection()
                    ->addAttributeToSelect('*')
                    ->addAttributeToFilter('sku',array('in'=>$skus))
                    ->addAttributeToFilter('visibility',array('gt'=>array(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE)))
                    ->addAttributeToFilter('status',array('eq'=> Mage_Catalog_Model_Product_Status::STATUS_ENABLED))
                    ->addUrlRewrite()
    ;

¿Cómo puedo ordenar esta colección para que los productos aparezcan en el mismo orden que sus skus dentro de la matriz $skus?

¿Fue útil?

Solución

He hecho algo similar usando MySQL. FIELD() función.Quizás también te pueda ayudar aquí.

Después de haber agregado los otros filtros a su colección, llame a esto:

$collection->getSelect()->order(new Zend_Db_Expr('FIELD(sku, "' . implode('","', $skus) . '") DESC'));

Otros consejos

Al crear una colección usando Mage::getModel('catalog/product')->getCollection() o Mage::getResourceModel('catalog/product_collection') la mesa principal de recolección es catalog_product_entity.Esta tabla contiene una sku columna que también está indexada, por lo que es más eficaz filtrar y ordenar por esta columna en la tabla principal.Esto te daría algo como:

$collection = Mage::getResourceModel('catalog/product_collection');
$collection
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('visibility',array('gt'=>array(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE)))
    ->addAttributeToFilter('status',array('eq'=> Mage_Catalog_Model_Product_Status::STATUS_ENABLED))
    ->addUrlRewrite();

$collection->getSelect()
    ->where('sku IN (?)', $skus)
    ->order('sku DESC');

No necesitas hacer nada más para ordenar la colección porque ya estás filtrando por SKU.

También te recomendaría que no solo ->addAttributeToSelect('*'), en su lugar, agregue solo los atributos que necesita.Debido a la estructura EAV de las tablas de productos, cada atributo agregado agregará complejidad a la consulta de la base de datos y hará que la llamada sea menos eficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top