按数组键对产品集合进行排序
-
13-12-2019 - |
题
我正在尝试根据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结构,每个添加的属性都会增加数据库查询的复杂性,并使调用效率降低。