2010-12-04 111 views
16

我有以下幾點:的Magento得到蘭德公司從類別,訂購產品()

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

但我需要通過ID RAND()訂購,我該怎麼辦呢? (該代碼顯示我已經嘗試過沒有運氣)

+1

難道你不是說你想對`RAND()`而不是`id = RAND()`進行排序嗎? ASAIK`RAND()`會返回一個介於0和1之間的數字 – Harmen 2010-12-04 21:50:24

+0

對不起,您是對的 – Ashley 2010-12-04 23:07:41

回答

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

您有一些很好的知識 – 2010-12-05 20:24:46

+0

這是一個很大的輸出的簡短答案...非常感謝..我有一個相同的要求,你的解決方案工作很多.. – 2014-02-08 10:26:49

0

使用ORDER BY RAND()返回列表隨機順序中的項目將需要全表掃描和排序。它會對錶中大量行的性能產生負面影響。

如何優化此查詢有幾種可能的解決方案。 Magento爲此提供了一個本地解決方案。

orderRand()方法Varien_Db_Select和數據庫適配器允許爲ORDER BY指定隨機順序和槓桿指數。 指定一些整數索引列的名稱的ORDER BY子句中使用,例如:

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

爲實現細節參見Varien_Db_Adapter_Pdo_Mysql::orderRand()