我需要迭代一些产品并访问自定义属性,我的代码是:
$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循环中花费大量时间。我可以通过加载具有所有属性的集合来加速这个吗?
答案 0 :(得分:1)
我建议你所有的属性应该放在平面表中。
一些属性设置如搜索,可在前端列表中找到。
然后进行索引。
现在,当您获得产品集合时,您将获得所需的属性,然后从那里获得代码。
您需要加载一系列产品,而不是加载每个产品的循环。
答案 1 :(得分:0)
如果您使用的是平台,则必须将自定义属性添加到平面索引中。您可以将它们添加到相应模块的config.xml中。 您可以跳过foreach中的productload,这可能会导致处理时间过长。
答案 2 :(得分:-2)
你在做什么不是一个好习惯,应该避免。你可以试试这个
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循环,你需要选择平面表概念。这是我所知道的唯一一种方式。否则你无法避免每个循环。 :)