Magento get a product collection in an arbitrary order

前端 未结 2 930
抹茶落季
抹茶落季 2020-12-09 23:01

I have developed a custom search engine for our Magento store and I am trying to load the product collection in a very specific order (I have ranked the results according to

2条回答
  •  时光说笑
    2020-12-09 23:55

    Collections inherit from the class

    Varien_Data_Collection_Db
    

    There's a method named addOrder on that class.

    public function addOrder($field, $direction = self::SORT_ORDER_DESC)
    {
        return $this->_setOrder($field, $direction);
    }
    

    So, you'd think something like this should work for basic ordering

    Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addOrder('entity_id');
    

    However, it doesn't. Because of the complex joining involved in EAV Collections, there's a special method used to add an attribute to the order clause

    Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection::addAttributeToSort
    

    However again, this can only be used to add simple attributes. To create an arbitrary sort, you'll need to manipulate the Zend_Select object directly. I'm not a big fan of this, and I'm not a big fan of using custom mysql functions to achieve things, but it appears it's the only way to do this

    I tested the following code on a stock install and got the desired results. You should be able to use it to get what you want.

            $ids = array(16,18,17,19);
            $products = Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToSelect('*')
            ->addAttributeToFilter('entity_id',$ids);           
    
                        //shakes fist at PDO's array parameter
                        $ids = array_map('intval', $ids);
            $products->getSelect()->order("find_in_set(e.entity_id,'".implode(',',$ids)."')");
            foreach($products as $product)
            {
                var_dump($product->getEntityId());
                var_dump($product->getSku());
            }
    

提交回复
热议问题