我的意思是 - 有没有办法要做:

$collection = $model->getCollection();
foreach ($collection as $item) { 
    $item->doStuff();
}

以这样的方式,即使该集合有100k行,它也只会一次从MySQL加载一页,并在幕后为您提供神奇的分页。

从看 Varien_Data_Collection_Db::load() 似乎不可能,而只是想检查。这似乎是普遍的需求。

有帮助吗?

解决方案

你应该真正使用

Mage::getSingleton('core/resource_iterator')

为此,它纯粹是出于您提到的绩效原因而存在的。

否则,您可以使用带有带有的循环使用的略微优雅的解决方案 setPageSize - 这里有一个很好的例子, https://stackoverflow.com/questions/3786826/how-to-to-loop-a-magento-collection

其他提示

我同意 本·莱萨尼(Ben Lessani) 您应该使用 core/iterator 一次加载大收藏的资源模型 如果可能的话.

但是,存在局限性。如在AddAttributetoselect不使用core/resource_iterator?“如果您需要从属性值表中包含值,则与EAV模型无法正常工作。

实际上,来自Stackoverflow的链接示例并不是那么好,因为它可以重复相同的查询 LIMIT 表达。对于复杂的查询,这可能是一个性能问题,但更重要的是,如果介于两者之间,您将获得重复。

处理块中收集的一种更好的方法是首先加载所有ID,然后将这些ID用作实际分类集合的过滤器。

产品的简单示例:

$ids = Mage::getModel('catalog/product')
    ->getCollection()
    ->getAllIds();

$page = 1;
do {
    $collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->addIdFilter($ids)
        ->setPageSize(100)
        ->setCurPage($page);

    $results = $collection->load();

    // do stuff ......

    $page++;

} while ($results->count());
许可以下: CC-BY-SA归因
scroll top