产品收集的工作原理

时间:2013-05-28 22:56:05

标签: php magento

不幸的是,我目前没有办法测试这段代码,但想要询问社区结果是什么以及在场景后执行的操作顺序。这是一个简短的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()'));
}

1 个答案:

答案 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继承CountableVarien_Data_Collection界面的集合类的副作用。

仅供参考,一旦集合类有load() ed,就必须clear()编辑才能重新发出查询。