从分类中获取Magento产品,按rand()排序

18

我有如下代码:

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

但是我需要按id RAND()排序,我该怎么做?(下面的代码是我尝试过但没有成功的)


1
你的意思不是想按 id = RAND() 而是按 RAND() 进行排序吗?据我所知,RAND() 会返回一个介于0和1之间的数字。 - Harmen
3个回答

34

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()'));

为了查看将要执行的查询语句,您可以使用以下构造方式

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

你有很棒的知识。 - Knowledge Craving
这是一个简短的答案,但输出很多...非常感谢。我有同样的需求,你的解决方案帮了我大忙。 - Pavan Kumar

11

不错。但我认为这次是安德烈做到了。 - clockworkgeek
@clockworkgeek - 当然,我并不是想从Andrey那里拿走分数,只是想在发布问题之前提醒大家先搜索一下:) 也许我应该更直接一些 :) - Jonathan Day
@JonathanDay 我尝试了这个解决方案,但是出现以下错误。有什么想法吗?未识别的方法'setCurPage()'";i:1;s:4108:"#0 ...\app\code\core\Mage\Catalog\Block\Product\List\Toolbar.php(225): Zend_Db_Select->__call('setCurPage', Array) - Mohit

1
使用ORDER BY RAND()返回随机顺序的项目列表将需要完整的表扫描和排序。在表中有大量行时,它可能会对性能产生负面影响。
有几种替代方案可以优化此查询。Magento提供了本地解决方案。 Varien_Db_SelectorderRand()方法和数据库适配器允许指定随机顺序并利用索引进行ORDER BY。 指定某个整数索引列的名称以在ORDER BY子句中使用,例如:
$collection->getSelect()->orderRand('main_table.entity_id');

请查看Varien_Db_Adapter_Pdo_Mysql::orderRand()以了解其实现细节。

这对我起作用:$collection->getSelect()->orderRand('e.entity_id'); 但是,至少在我的情况下,与 ->order(new Zend_Db_Expr('RAND()')) 相比,这种方法并没有提高性能。 - Andreas Riedmüller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接