Php magento从类别中获取产品,按兰德订购()

Php magento从类别中获取产品,按兰德订购(),php,collections,magento,random,Php,Collections,Magento,Random,我有以下资料: $products = Mage::getModel('catalog/product') ->getCollection() ->addAttributeToSort('id', 'RAND()') ->addAttributeToSelect('small_image') ->addCategoryFilter(Mage::getModel('catalog/category')->load($catId));

我有以下资料:

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

但是我需要按id
RAND()
订购,我该怎么做?(代码显示了我是如何在没有运气的情况下尝试的)

Magento集合不接受除所选属性之一之外的其他参数。在这种情况下,您应该获取
Zend\u Db\u 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
请参考以下问题:以及钟表匠的答案:

$collection->getSelect()->order(new Zend_Db_Expr('RAND()'));
使用
orderbyrand()
以随机顺序返回项目列表将需要对整个表进行扫描和排序。它会对表中大量行的性能产生负面影响

关于如何优化此查询,有几种可选的解决方案。Magento为此提供了本机解决方案

Varien\u Db\u Select的
orderand()
方法和数据库适配器允许为
order BY
指定随机顺序并利用索引。 指定要在
ORDER BY
子句中使用的某个整数索引列的名称,例如:

$collection->getSelect()->orderRand('main_table.entity_id');

请参见
Varien\u Db\u Adapter\u Pdo\u Mysql::orderRand()
,了解实现细节。

您的意思是不是希望按
RAND()
排序,而不是按
id=RAND()
排序?ASAIK
RAND()
将返回一个介于0和1Nice之间的数字。但我想安德烈这次得到了。@clockworkgeek-当然,并不是想从安德烈身上拿走分数,只是在发帖前对搜索提出一个微妙的观点:)也许我本应该不那么微妙:)@JonathanDay我尝试了这个解决方案,但出现了以下错误。有什么想法吗?无法识别的方法“setCurPage()”;i:1;s:4108:“#0…\app\code\core\Mage\Catalog\Block\Product\List\Toolbar.php(225):Zend\u Db\u Select->u调用('setCurPage',Array')您有一些很好的知识这是一个关于大输出的简短回答。。。谢谢。。我有一个相同的需求,你的解决方案非常有效。这对我来说确实有效:
$collection->getSelect()->orderand('e.entity_id')
但是,至少在我的例子中,与
->order(新的Zend_Db_Expr('RAND()'))相比,这种方法并没有提高性能。