我有以下内容:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSort('id', 'RAND()')
->addAttributeToSelect('small_image')
->addCategoryFilter(Mage::getModel('catalog/category')->load($catId));
但我需要按照RAND()
订购,我该怎么做? (代码显示了我没有运气的尝试)
答案 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');
。