Magento加载具有所有属性的产品集合


Magento load product collection with all attributes

我需要迭代一些产品并访问自定义属性,我的代码是:

$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循环。:)