Classifique a coleção de produtos por uma chave de array
-
13-12-2019 - |
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?
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.