2010-12-04 77 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()