Pergunta

Estou tentando classificar uma coleção de produtos por SKU com base na ordem em que os SKUs aparecem na matriz $skus passada para o método addAttributeToFilter na coleção abaixo:

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

Como posso classificar esta coleção para que os produtos apareçam na mesma ordem que seus skus dentro do array $skus?

Foi útil?

Solução

Eu fiz algo semelhante usando o MySQL FIELD() função.Talvez também possa ajudá-lo aqui.

Depois de adicionar os outros filtros à sua coleção, chame isto:

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

Outras dicas

Ao criar uma coleção usando Mage::getModel('catalog/product')->getCollection() ou Mage::getResourceModel('catalog/product_collection') a tabela de coleção principal é catalog_product_entity.Esta tabela contém um sku coluna que também é indexada, por isso é mais eficiente filtrar e classificar por esta coluna na tabela principal.Isso lhe daria 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');

Você não precisa fazer mais nada para solicitar a coleção, pois já está filtrando por SKU.

Eu também recomendaria que você não apenas ->addAttributeToSelect('*'), em vez disso, adicione apenas os atributos necessários.Devido à estrutura EAV das tabelas de produtos, cada atributo adicionado adicionará complexidade à consulta ao banco de dados e tornará a chamada menos eficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top