如何指定产品收集的自定义排序顺序?


12

我正在尝试基于产品ID数组创建一个产品集合,并根据ID数组对集合进行排序。

$productIds = array(318,310,311);
$collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->setOrder('entity_id', 'asc') // This will not do the job
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('entity_id', array(
    'in' => $productIds,
        ));

我想对收集的数据进行排序,因为它们出现在$productIds数组中,318, 310, 311但是上面的代码将返回收集的排序,如310,311, 312

如果不使用下面给出的简单MySQL查询,是否可以做到这一点?

SELECT *
FROM catalog_product_entity
WHERE entity_id IN (318,
                    310,
                    311)
ORDER BY FIELD(entity_id, 318, 310, 311);

Answers:


18

可悲的是,Magento将验证Varien_Data_Collection_Db _setOrder功能中的订购选项。但是您可以选择集合并添加一个新表达式以根据需要构建订单。

/* @var $collection Mage_Catalog_Model_Resource_Product_Collection */
$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('status', 1)
    ->addAttributeToFilter('entity_id', array(
            'in' => $productIds,
        ));

$collection->getSelect()->order(new Zend_Db_Expr('FIELD(e.entity_id, ' . implode(',', $productIds).')'));

foreach($collection as $product) {
    var_dump($product->getId());
}

在这里,您应该看到产品ID的排列顺序为阵列。


有用!谢谢。我们可以将按SKU排序到上面吗?
塔希尔·亚辛

您可以使用以下语法将多个字段添加到此顺序FIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.