Tri De La Collection De Produits Par Une Clé Du Tableau
-
13-12-2019 - |
Question
Je suis en train de trier une collection de produits par le SKU basé sur l'ordre dans lequel les Références apparaissent dans le $sku tableau passé dans le addAttributeToFilter méthode dans la collection ci-dessous:
$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()
;
Comment puis-je sorte de cette collection, de sorte que les produits apparaissent dans le même ordre que leurs références à l'intérieur de l' $sku tableau?
La solution
J'ai fait quelque chose de similaire à l'aide de la fonction MySQL GeneraCoDiCodeCode.Peut-être que cela peut aussi vous aider ici.
Après avoir ajouté les autres filtres à votre collection, appelez ceci:
$collection->getSelect()->order(new Zend_Db_Expr('FIELD(sku, "' . implode('","', $skus) . '") DESC'));
Autres conseils
Lors de la création d'une collection à l'aide Mage::getModel('catalog/product')->getCollection()
ou Mage::getResourceModel('catalog/product_collection')
la collection principale de la table est catalog_product_entity
.Cette table contient une sku
la colonne qui est également indexées de sorte qu'il est plus efficace à la fois de filtre et de tri par cette colonne dans la table principale.Ce serait vous donner quelque chose comme:
$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');
Vous n'avez pas besoin de faire quoi que ce soit à l'ordre de la collection que vous êtes déjà filtrage par SKU.
Je vous recommande également de ne pas seulement ->addAttributeToSelect('*')
, au lieu d'ajouter les attributs dont vous avez besoin.En raison de l'EAV de la structure du produit, les tables de chaque attribut d'ajouter, ajouter de la complexité à la requête de base de données et faire l'appel de moins en moins efficace.