Ordina la raccolta di prodotti da una chiave di array
-
13-12-2019 - |
Domanda
Sto cercando di ordinare una raccolta di prodotti tramite SKU in base all'ordine in cui gli SKU appaiono nell'array $ SKUS passarono nel metodo AddattributetOfilter nella collezione di seguito:
$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()
;
.
Come posso ordinare questa collezione in modo che i prodotti appaiano nello stesso ordine del loro SKU all'interno dell'array $ SKU?
Soluzione
Ho fatto qualcosa di simile utilizzando la funzione FIELD()
MySQL.Forse può anche aiutarti qui.
Dopo aver aggiunto gli altri filtri alla tua collezione, chiamalo:
$collection->getSelect()->order(new Zend_Db_Expr('FIELD(sku, "' . implode('","', $skus) . '") DESC'));
. Altri suggerimenti
Quando si crea una raccolta utilizzando Mage::getModel('catalog/product')->getCollection()
o Mage::getResourceModel('catalog/product_collection')
La tabella di raccolta principale è catalog_product_entity
.Questa tabella contiene una colonna sku
che è anche indicizzata in modo che sia più efficiente sia per il filtro che per ordinare con questa colonna nella tabella principale.Questo ti darebbe qualcosa come:
$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');
.
Non è necessario fare altro per ordinare la raccolta come stai già filtrando da SKU.
Ti consiglierei anche di non solo ->addAttributeToSelect('*')
, aggiungi invece solo gli attributi di cui hai bisogno.A causa della struttura EAV delle tabelle dei prodotti, ciascun attributo aggiunta aggiungere la complessità alla query del database e renderà la chiamata meno efficiente.