是否有可能在本机上迭代分页上的洋红色收藏?
-
16-10-2019 - |
题
我的意思是 - 有没有办法要做:
$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());