2010-12-04 9 views
16

मैं निम्नलिखित है:रैंड श्रेणी, आदेश से उत्पादों को प्राप्त Magento()

$products = Mage::getModel('catalog/product') 
    ->getCollection() 
    ->addAttributeToSort('id', 'RAND()') 
    ->addAttributeToSelect('small_image') 
    ->addCategoryFilter(Mage::getModel('catalog/category')->load($catId)); 

लेकिन मैं आईडी RAND() से ऑर्डर करने के लिए की जरूरत है, कैसे मैं यह कर सकता है? (कोड दिखाता है कि मेरे पास कोई भाग्य के साथ की कोशिश की है)

+1

तुम्हारा मतलब आप 'RAND()' के बजाय 'आईडी = रैंड()' पर सॉर्ट करने के लिए नहीं करना चाहते? ASAIK 'RAND()' 0 और 1 – Harmen

+0

बीच की एक संख्या वापस आ जाएगी हां खेद तुम सही – Ashley

उत्तर

29

Magento संग्रह अन्य पैरामीटर स्वीकार नहीं करता तो चयनित विशेषता में से एक। इस मामले में आप Zend_Db_Select वस्तु मिलता है और इसे करने के लिए आदेश अनुदेश जोड़ना चाहिए।

$products = Mage::getModel('catalog/product') 
    ->getCollection() 
    ->addAttributeToSort() 
    ->addAttributeToSelect('small_image') 
    ->addCategoryFilter(Mage::getModel('catalog/category')->load()); 
$products->getSelect()->order(new Zend_Db_Expr('RAND()')); 

देखने के लिए क्या क्वेरी आप इस construnction

$products->load(true, true); // first parameter show sql query in output, second show sql query in var/log/syslog 
+0

आप इस बड़े उत्पादन के लिए एक संक्षिप्त उत्तर है कुछ महान ज्ञान –

+0

है ... धन्यवाद एक बहुत .. मैं एक ही आवश्यकता है और आपका समाधान बहुत काम करता है .. –

11

उपयोग कर सकते हैं निष्पादित किया जाएगा इस सवाल का संदर्भ लें: query magento limit + order by rand() और clockworkgeek का जवाब:

$collection->getSelect()->order(new Zend_Db_Expr('RAND()')); 
+0

अच्छा। लेकिन मुझे लगता है कि एंड्री ने इसे इस बार प्राप्त किया था। – clockworkgeek

+0

@clockworkgeek - बिल्कुल, एंड्री से अंक लेने की कोशिश नहीं कर रहा था, बस पोस्ट करने से पहले खोज के बारे में एक सूक्ष्म बिंदु बनाओ :) शायद मुझे कम सूक्ष्म होना चाहिए :) –

+0

@ जोनाथनडे मैंने इस समाधान की कोशिश की लेकिन निम्नलिखित त्रुटि प्राप्त की। कोई उपाय? अपरिचित विधि 'setCurPage()' "; i: 1; s: 4108:" # 0 ... \ app \ code \ core \ mage \ catalog \ block \ product \ list \ Toolbar.php (225): Zend_Db_Select -> __ कॉल ('setCurPage', Array) – Mohit

0

ORDER BY RAND() का उपयोग करते हुए की एक सूची वापस जाने के लिए एक यादृच्छिक क्रम में वस्तुओं को एक पूर्ण टेबल स्कैन और सॉर्ट की आवश्यकता होगी। यह तालिका में बड़ी संख्या में पंक्तियों पर प्रदर्शन को नकारात्मक रूप से प्रभावित कर सकता है।

कई वैकल्पिक समाधान कैसे इस क्वेरी अनुकूलन करने के लिए के संभावित हैं। Magento इसके लिए एक मूल समाधान प्रदान करता है।

Varien_Db_Select की orderRand() विधि और डेटाबेस एडाप्टर एक यादृच्छिक क्रम और ORDER BY के लिए लाभ उठाने के सूचकांक निर्दिष्ट करने के लिए अनुमति देता है। कुछ पूर्णांक अनुक्रमित स्तंभ का नाम निर्दिष्ट करें, ORDER BY खंड में प्रयोग की जाने वाली उदाहरण के लिए:

$collection->getSelect()->orderRand('main_table.entity_id'); 

क्रियान्वयन संबंधी विवरण के Varien_Db_Adapter_Pdo_Mysql::orderRand() देखें।

+0

यह मेरे लिए काम करता है: '$ संग्रह-> getSelect() -> orderRand ('e.entity_id'); 'लेकिन, कम से कम मेरे मामले में, यह विधि नहीं बढ़ी 'की तुलना में प्रदर्शन -> आदेश (नई Zend_Db_Expr ('रैंड()'))' –

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