1

不幸的是,我目前没有办法测试这段代码,但想问问社区结果会是什么,以及幕后执行的操作顺序。这是一个简短的 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 个最新的产品/实体 ID。

我不清楚它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()'));
}
4

1 回答 1

2

必须首先在集合对象上设置随机顺序子句。但是,除非我弄错了,否则您的条件 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();
}

编辑 - 我已经重读了您的问题,并且我要添加以下内容:查询的部分(例如 order 子句),更重要的是,在隐式或显式加载集合对象之前,查询结果不可用。您可以执行类似于以下的操作:

$items = $productCollection->getItems();
shuffle($items);

然后使用 $items 数组。

后续编辑 - 响应 OP 编辑

关于C.& D.- Collection 类在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()编辑,它必须被clear()编辑才能重新发出查询。

于 2013-05-28T23:28:39.377 回答