是否可以使用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集合来做到这一点?
答案 0 :(得分:11)
$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))
答案 1 :(得分:2)
相当古老,但我在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)."')");
答案 2 :(得分: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的集合和对{{1}的调用可能无法实现}或addAttributeToSort
)
然后,您可以使用Gershon答案中所述的多个sortOrder
调用,或使用带有生成的order
语句的单个order
。知道它可能取决于您可能需要过滤的最大ID数。
答案 3 :(得分: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')
;