2012-07-17 16 views
7

Bir Magento koleksiyonunu bir dizi kimlik kullanarak filtrelemeye hazır hale getirerek, BUT no lu bir dizi süzgecin sırasına göre sipariş toplama sırasına göre sipariş verebilirsiniz. ÖrneğinMagento - Array ile Toplama Süzgeci Siparişe Devam Et

:

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

ben sırayla ürüne sahip olmak koleksiyon istiyorum, 1,3,2 yüzden bu sırayla çıkıp koleksiyonunda döngü olduğu gibi?

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

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

Bu açıkça çalışır ama bunu yapmak için çirkin bir yol gibi görünüyor:

i anda sahip tek alternatif elle bir dizi ürünü yaratmaktır.

Sadece magento koleksiyonları ile bunu yapmanın bir yolu var mı?

cevap

0

Bu burada, zorlu bir sorudur çalışması gerekir bir çözümdür:

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

Merhaba Gershon ise, yanıt için teşekkürler. AttributeToSort açısından mantıklıdır, ancak problem yukarıda addAttributeToFilter örneğinin sadece bir örnektir, dizideki rastgele sayıdaki bir sayı olabilir. Her elemanın üstesinden gelip addAttributeToSort'u arayabileceğimi sanıyorum, ama daha sonra bir dizi olarak koleksiyon oluşturmaya başladığım bölgeye giriyorum. –

1

Sen PHP bunu sıralamadan önce toplanmasını yükleyebilirsiniz. Ör:

Else
$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; 
    } 
} 

tamamen koleksiyonları ile, önce koleksiyonun Zend_Db_Select nesnesi tarafından geçmelidir, örneğin EAV bazlı koleksiyonları ile mümkün olmayabilir neler ifadeler (göre sıralama muktedir ve addAttributeToSort veya çağrı sortOrder).
Daha sonra, Gershon'un yanıtında belirtildiği şekilde birden çok order çağrılarını kullanabilir veya oluşturulmuş bir CASE WHEN THEN bildirimi ile tek bir order kullanabilirsiniz. Filtrelemek zorunda olabileceğiniz maksimum kimlik sayısına bağlı olabileceğini bilmek.

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)) 
+0

Sadece mükemmel çözüm. Harika çalışıyor. – Muttley75

2

Oldukça eski ama stackoverflow bulunan basit bir çözüm

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

from here on stackoverflow

İlgili konular