我正在尝试根据Sku在传递到下面集合中的addAttributeToFilter方法的$skus数组中出现的顺序,按SKU对产品集合进行排序:

    $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()
    ;

如何对此集合进行排序,以便产品在$skus数组中以与其sku相同的顺序出现?

有帮助吗?

解决方案

我用mysql FIELD()函数做了类似的东西。也许它也可以帮助你这里。

将其他过滤器添加到您的集合后,调用此:

$collection->getSelect()->order(new Zend_Db_Expr('FIELD(sku, "' . implode('","', $skus) . '") DESC'));
.

其他提示

创建集合时使用 Mage::getModel('catalog/product')->getCollection()Mage::getResourceModel('catalog/product_collection') 主要收集表是 catalog_product_entity.此表包含一个 sku 也被索引的列,因此在主表中按此列进行过滤和排序是最有效的。这会给你类似的东西:

$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');

您不需要再做任何事情来订购集合,因为您已经通过SKU进行过滤。

我也建议你不要只是 ->addAttributeToSelect('*'), ,而是只添加您需要的属性。由于产品表的EAV结构,每个添加的属性都会增加数据库查询的复杂性,并使调用效率降低。

许可以下: CC-BY-SA归因
scroll top