magento从类别中获取产品,按rand()排序

时间:2010-12-04 21:48:24

标签: php collections magento random

我有以下内容:

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

但我需要按照RAND()订购,我该怎么做? (代码显示了我没有运气的尝试)

3 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:11)

请参阅此问题:query magento limit + order by rand()和clockworkgeek的回答:

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

答案 2 :(得分:1)

使用ORDER BY RAND()以随机顺序返回项目列表需要进行全表扫描和排序。它会对表中大量行的性能产生负面影响。

如何优化此查询有几种替代解决方案。 Magento为此提供了原生解决方案。

orderRand()的{​​{1}}方法和数据库适配器允许为Varien_Db_Select指定随机顺序和杠杆索引。 指定要在ORDER BY子句中使用的某个整数索引列的名称,例如:

ORDER BY

有关实施细节,请参阅$collection->getSelect()->orderRand('main_table.entity_id');