使用Magento';产品集合上的资源迭代器模型

使用Magento';产品集合上的资源迭代器模型,magento,Magento,我最近发现了以下关于调用大型产品集合时使用Magento的资源迭代器模型以节省资源的文章-。然而,我发现很难准确地找出如何让它输出完全相同的数据 因此,假设我使用以下方法获取完整的产品集合并输出sku: $productCollection = Mage::getModel('catalog/product')->getCollection(); foreach($productCollection as $product){ echo $product->getSku().

我最近发现了以下关于调用大型产品集合时使用Magento的资源迭代器模型以节省资源的文章-。然而,我发现很难准确地找出如何让它输出完全相同的数据

因此,假设我使用以下方法获取完整的产品集合并输出sku:

$productCollection = Mage::getModel('catalog/product')->getCollection();
foreach($productCollection as $product){
    echo $product->getSku().',';
}
使用分析器,我看到这是使用1154480字节来处理的

现在使用资源迭代器模型,如下所示:

function productCallback($args)
{
    $product = Mage::getModel('catalog/product');
        $product->setData($args['row']);
        echo $product->getSku().',';
}
$_productCollection = Mage::getModel('catalog/product')->getCollection();;
$_productCollection = Mage::getSingleton('core/resource_iterator')->walk($_productCollection->getSelect(), array('productCallback'));
这使用199912字节。所以得到同样的东西有很大的不同,只是一个基本的sku列表

但我的问题是,例如,如果我想制作一个样式良好的产品列表,并获取它们的图像、URL等,我以前会在$productCollection上使用foreach循环,如第一个示例中所示:

foreach($_productCollection as $product){
echo $product->getSku().',';
};
但这已经不起作用了。看起来,当它通过回调时,其作用与foreach循环相同,依次运行每个产品


那么,如何让我的收藏以与以前相同的格式返回,使它再次在foreach循环中工作?是否需要将产品添加到阵列中?如果是这样,我该怎么做?

我想你可能没有抓住要点。当您不需要完全面向对象的方法或记录数组,并且可以使用数据库中的原始值时,资源迭代器是很好的选择


要输出图像和价格之类的内容,您需要产品对象的实例,这些实例具有计算图像缩略图的功能,或者折扣如何影响价格。此外,当产品对象加载时,它会触发各种事件,以便其他模块也可以进行修改,这也是Magento如此可扩展的部分原因。如果您担心内存使用或执行时间,请不要更改任何其他内容。

@clockworkgeek-您是对的。此外,

$visibility = array(
                      Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
                      Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
                  );

$_productCollection = Mage::getResourceModel('reports/product_collection')
                              ->addAttributeToSelect('*')
                              ->addOrderedQty()
                              ->addAttributeToFilter('visibility', $visibility)
                              ->setOrder('ordered_qty', 'desc');

这个问题是前一段时间提出来的,但我想补充一点,可以在回调函数中加载产品,获取所需的任何属性,并通过公共方法将其存储在对象的受保护成员数组中

例如,您可能有一个模型,如

class Company_Module_Model_Indexer_Entity_Product
     public function addToData($key, $data)
    {
        $this->_data[$key] = $data;
    }
然后,在此类的方法中,您可以有:

Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array(
            function ($args) {
                $rowProduct = Mage::getModel('catalog/product')->setData($args['row']);
                $indexKey   = $rowProduct->getId();
                $product    = Mage::getModel('catalog/product')->load($rowProduct->getId());

                $args['invoker']->addToData($indexKey, [YOUR_DATA]);
            }
        ), array('invoker' => $this));

问题是,如果我想要一个产品集合,比如说畅销书,我不希望它被缓存,因为它不会实时更新。但如果说我只想要4种产品,似乎即使我指定只返回4种产品,包括它们的图片、名称、价格等,它仍然贯穿整个系列。因此,我认为如果我只是使用资源迭代器获取4个所需的sku,那么在foreach循环中,我可以使用sku只加载这4个产品所需的数据。对于畅销书,我会说你仍然应该缓存输出,但缓存标记受订单影响。下订单(已售出的商品)时,刷新呈现的输出。如果您可以在加载产品集合之前按售出金额过滤产品集合,则可以避免遍历整个集合。首先在SQL中执行,这样就不会在PHP中执行。您目前如何衡量销售金额?也许您还可以使用
setPageSize(4)
来限制返回对象的数量。另一个选项是
->setPage(1,4)