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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top