2012-07-17 27 views
7

आईडी के की एक सरणी का उपयोग करके एक Magento संग्रह फ़िल्टर करना संभव है लेकिन में फ़िल्टर के पास आईडी के आदेश द्वारा क्रमबद्ध संग्रह परिणाम हैं।Magento - संग्रह द्वारा फ़िल्टर फ़िल्टर करें

उदाहरण के लिए:

$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

यह एक चुनौतीपूर्ण सवाल है, यहाँ है एक समाधान है कि काम करना चाहिए है:

$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

हाय गेर्शोन है, इस सवाल का जवाब के लिए धन्यवाद। यह विशेषता ToSort के संबंध में समझ में आता है लेकिन समस्या यह है कि उपरोक्त addAttributeToFilter उदाहरण केवल एक उदाहरण है, सरणी में तत्वों की मनमानी संख्या हो सकती है। मुझे लगता है कि मैं प्रत्येक तत्व पर लूप कर सकता हूं और addAttributeToSort पर कॉल कर सकता हूं लेकिन फिर उस क्षेत्र में प्रवेश कर रहा हूं जहां मैंने लूप के साथ एक सरणी –

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 आधारित संग्रह के साथ संभव नहीं हो सकता क्या पर सॉर्ट करने के लिए सक्षम होने के लिए और addAttributeToSort या करने के लिए कॉल sortOrder)।
फिर आप या तो order कॉल का उपयोग कर सकते हैं जैसा कि गेर्शन के उत्तर में बताया गया है, या उत्पन्न कथन के साथ एक order का उपयोग करें। यह जानकर कि यह अधिकतम आईडी की संख्या पर निर्भर हो सकता है जिन पर आपको फ़िल्टर करना पड़ सकता है।

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

संग्रह को बनाने के लिए शुरू किया था। बहुत अच्छा काम करता है। – Muttley75

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

from here on stackoverflow

संबंधित मुद्दे