我需要迭代一些产品并访问自定义属性,我的代码是:
$collection = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(array('attribute' => 'status', 'eq' => '1')))
// more filters
->load();
那么我必须:
foreach ($collection as $product) {
// here I can't access custom attributes
$product = Mage::getModel('catalog/product')->load($product->getId());
// here I can access them
}
,我的问题是,当我有很多产品,我的脚本花了很多时间在foreach循环。我能以某种方式通过加载集合与所有属性来加速这一点吗?
我建议你所有的属性都应该放在平面表格中。
所以做一些属性设置,比如可搜索的,在前端列表中可用。
然后执行索引。
现在,当您获得产品集合时,您将从那里获得所需的属性和代码。
不是循环加载每个产品,而是加载一个产品集合。
如果使用的是平面表,则必须将自定义属性添加到平面索引中。您可以在相应模块的config.xml中添加它们。您可以跳过foreach中的productload,这可能会导致较长的处理时间。
您正在做的不是一个好的实践,应该避免。你可以试试这个
foreach($collection->getItems() as $item){
echo $item->getName(); //$item is product instance. you can use it
}
编辑
在你的问题中,你犯了一个严重的错误,应该避免。这就是我想通过我的回答指出的。看看你在这里做什么。
foreache($bigcollection as $singleone){
$product = Mage::getModel('catalog/product')->load($id);
}
基本上你是在一个大的for循环中加载一个产品。这是一个很大的错误。因为如果你这样做,Magento需要从数据库做"额外的抓取工作"。不要使用这个方法。通过我的解决方案,我向您展示了如何避免在forloop中加载产品。这是非常可靠的方法。
如果你不想使用forloop,我认为你需要编辑你的问题并把这个要求放在那里。
如果你需要避免for循环,你需要使用平面表的概念。这是我唯一知道的办法。否则就无法避免for each循环。:)