Magento的 - 通过阵列收集过滤保持秩序(Magento - Collection Filte

2019-07-30 11:11发布

是否有可能使用的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的收藏纯粹做到这一点?

Answer 1:

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


Answer 2:

很老,但一个简单的解决办法,我就发现计算器是

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

从这里开始计算器



Answer 3:

您可以在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集合,并呼吁addAttributeToSortsortOrder )。
然后,您可以使用多个order调用,如革顺的回答说明,或使用一个单一的order与已生成CASE WHEN THEN声明。 知道它可以依靠你可能要过滤的ID的最大数量。



Answer 4:

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

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


文章来源: Magento - Collection Filter by Array Keep Order
标签: magento