不幸的是,我目前没有办法测试这段代码,但想要询问社区结果是什么以及在场景后执行的操作顺序。这是一个简短的PHP代码,用于前端的洗牌和加载(不确定操作顺序)产品。 (A和B是本文中参考的标签)
A. $productCollection = Mage::getModel('catalog/product')->getCollection()
->setPageSize(10)
->addAttributeToSort('entity_id', 'DESC');
B. if ($sortType == 'shuffle') {
$productCollection->getSelect()->order(new Zend_Db_Expr('RAND()'));
}
我的问题是,这会在SELECT
设置A.
查询,并将订单随机化附加到B.
中的查询字符串并运行查询在B.
,导致相同的10个产品以随机顺序加载?
我问的原因是,在我们网站上运行的下面(简化)代码中,它总是按随机顺序加载10个不同的项目。从查看代码运行的顺序来看,正如我上面所描述的那样。请注意,此后$productCollection
可以在已加载项目时进行迭代。如果省略D.
,那么它只获得10个最新的产品/ entity_ids。
我不清楚 C.
本身如何加载产品,但D.
可以追溯更改已加载的内容。
C. $productCollection = Mage::getModel('catalog/product')->getCollection()
->setPageSize(10)
->addAttributeToFilter('visibility', 3)
->addAttributeToFilter('news_from_date', array('gteq' => $date));
D. if ($sortType == 'shuffle') {
$productCollection->getSelect()->order(new Zend_Db_Expr('RAND()'));
}
答案 0 :(得分:2)
必须首先在集合对象上设置random order子句。但是,除非我弄错了,否则你的条件A和B在一起使用时是独占的。也许使用任何一种方法都可行?
$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection->setPageSize(10);
if ($sortType == 'shuffle') {
$productCollection->getSelect()->orderRand(); //wrapper; entity_id is implicit
} else {
$productCollection->setOrder('entity_id'); //desc is default
}
如果两个调用不同,并且entity_id
字段被添加为第一个order
列,则必须在设置之前重置选择对象的order
部分随机顺序,在这种情况下,您的B部分将如下所示:
if ($sortType == 'shuffle') {
$productCollection->getSelect()->reset(Zend_Db_Select::ORDER);
$productCollection->getSelect()->orderRand();
}
编辑 - 我重新阅读了您的问题,我有以下内容添加:查询的部分(例如订单子句),更重要的是查询结果直到集合对象是隐式或显式加载的。您可以执行类似以下操作:
$items = $productCollection->getItems();
shuffle($items);
然后使用$ items数组。
后续编辑 - 响应OP编辑
关于C.
& D.
- 收集类在需要之前不会load()
。 C.
或D.
中没有可触发此操作的代码。但是,以下任何一项都将触发查询,检索结果和模型实例分配:
count($productCollection);
foreach($productCollection as $product){/*...*/};
$productCollection->getColumnValues();
$productCollection->getFirstItem();
$productCollection->getItemByColumnValue();
$productCollection->getItems();
$productCollection->getItemsByColumnValue();
$productCollection->getIterator();
$productCollection->getLastItem();
$productCollection->getSize();
$productCollection->load();
$productCollection->loadData();
注意 - 前两个是从IteratorAggregate
继承Countable
和Varien_Data_Collection
界面的集合类的副作用。
仅供参考,一旦集合类有load()
ed,就必须clear()
编辑才能重新发出查询。