7

是否可以使用 id 数组过滤 Magento 集合,集合结果按传递给过滤器的 id 顺序排序。

例如:

$collection = Mage::getModel('catalog/product')
                  ->getCollection()
                  ->addAttributeToFilter('entity_id', array(
                       'in' => array(1, 3, 2),
                   ));

我希望集合中的产品按顺序排列,1、3、2,以便在循环浏览集合时它们以特定顺序出现?

我目前唯一的选择是手动创建一系列产品:

$productIds = array(1,3,2);
$collection = array();

foreach($productIds as $productId) {
    $collection[] = Mage::getModel('catalog/product')->load($productId);
}

这显然有效,但似乎是一种丑陋的方法。

有没有办法纯粹通过 magento 收藏来做到这一点?

4

4 回答 4

12
$productIds = array(1,3,2);

/**
 * Build up a case statement to ensure the order of ids is preserved
 */
$orderString = array('CASE e.entity_id');
foreach($productIds as $i => $productId) {
    $orderString[] = 'WHEN '.$productId.' THEN '.$i;
}
$orderString[] = 'END';
$orderString = implode(' ', $orderString);

/**
 * Filter the collection
 */
$productCollection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('entity_id', array('in' => $productIds));

/**
 * Apply the order based on the case statement
 */
$productCollection->getSelect()
    ->order(new Zend_Db_Expr($orderString))
于 2012-07-23T11:48:33.577 回答
3

我在stackoverflow上找到的一个很旧但简单的解决方案是

$productIds = array(1,3,2);
$products = Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToFilter('entity_id', array('in' => $productIds));
$products->getSelect()->order("find_in_set(entity_id,'".implode(',',$productIds)."')");

从这里开始stackoverflow

于 2017-03-29T15:21:24.873 回答
1

您可以在 PHP 中对其进行排序之前加载该集合。例如:

$result = array();
$productIds = array(1,3,2);
$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToFilter('entity_id', array('in' => $productIds))
    ->load();

foreach ($productIds as $productId) {
    if ($product = $collection->getItemById($productId)) {
        $result[$productId] = $product;
    }
}

否则,纯粹使用集合,您应该首先通过Zend_Db_Select集合的对象,以便能够对表达式进行排序(例如,基于 EAV 的集合和对addAttributeToSortor的调用可能无法做到这一点sortOrder)。
然后,您可以order按照 Gershon 的回答中所述使用多个调用,也可以将单个调用order与生成的CASE WHEN THEN语句一起使用。知道这可能取决于您可能必须过滤的最大 ID 数。

于 2012-07-18T07:44:11.010 回答
0

这是一个具有挑战性的问题,这是一个应该可行的解决方案:

$collection = Mage::getModel('catalog/product')
                  ->getCollection()
                  ->addAttributeToFilter('entity_id', array(
                       'in' => array(1928, 1930, 1929),
                   ))
           ->addAttributeToSort('entity_id = 1928', 'ASC')
           ->addAttributeToSort('entity_id = 1930', 'ASC')
           ->addAttributeToSort('entity_id = 1929', 'ASC')
           ;
于 2012-07-17T21:39:15.230 回答