magento 从类别中获取产品,按 rand() 排序
Posted
技术标签:
【中文标题】magento 从类别中获取产品,按 rand() 排序【英文标题】:magento get products from category, order by rand() 【发布时间】:2011-05-20 08:28:25 【问题描述】:我有以下几点:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSort('id', 'RAND()')
->addAttributeToSelect('small_image')
->addCategoryFilter(Mage::getModel('catalog/category')->load($catId));
但我需要通过 id RAND()
订购,我该怎么做? (代码显示了我是如何尝试没有运气的)
【问题讨论】:
您不是说要按RAND()
而不是id = RAND()
进行排序吗? ASAIK RAND()
将返回一个介于 0 和 1 之间的数字
【参考方案1】:
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
【讨论】:
你知识渊博 这是大输出的简短答案...非常感谢..我有相同的要求,您的解决方案很有效..【参考方案2】:使用ORDER BY RAND()
以随机顺序返回项目列表将需要全表扫描和排序。它会对表中大量行的性能产生负面影响。
对于如何优化此查询,有几种可能的替代解决方案。 Magento 为此提供了本机解决方案。
Varien_Db_Select
的orderRand()
方法和数据库适配器允许为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()'))
相比,这种方法并没有提高性能【参考方案3】:
参考这个问题:query magento limit + order by rand()和clockworkgeek的回答:
$collection->getSelect()->order(new Zend_Db_Expr('RAND()'));
【讨论】:
不错。但我认为安德烈这次明白了。 @clockworkgeek - 绝对不是想从 Andrey 那里拿走分数,只是在发布之前对搜索提出一个微妙的观点 :) 也许我应该不那么微妙 :) @JonathanDay 我尝试了这个解决方案,但出现以下错误。任何想法?无法识别的方法 'setCurPage()'";i:1;s:4108:"#0 ...\app\code\core\Mage\Catalog\Block\Product\List\Toolbar.php(225): Zend_Db_Select-> __call('setCurPage', 数组)以上是关于magento 从类别中获取产品,按 rand() 排序的主要内容,如果未能解决你的问题,请参考以下文章