如何删除magento产品系列中的所有项目?

时间:2011-12-10 00:22:40

标签: collections magento

似乎不起作用:

<?php
    $collection = Mage::getModel('catalog/product')->getCollection();
    foreach($collection->getItems() as $key => $_product){
        //product
        $collection->removeItemByKey($key);
    }

?>

$ collection仍然填充

5 个答案:

答案 0 :(得分:13)

如果您想使用空集合,最好的方法是使用一个始终生成空集的过滤器加载它。这是一个例子:

$collection = Mage::getModel('catalog/product')->getCollection()
    ->addFieldToFilter('entity_id', 0);

因为Magento产品ID从1开始,所以此集合将保持为空,直到您使用addItem()方法向其添加项目。

另一方面,

clear()和removeItemByKey()只会触发第二次运行到数据库以重新获取你不想要的数据。

答案 1 :(得分:7)

你的问题没有意义。运行以下代码

$c = Mage::getModel('catalog/product')->getCollection();
foreach($c->getItems() as $key=>$item)
{
    $c->removeItemByKey($key);
}

foreach($c->getItems() as $key=>$item)
{
    var_dump($key);
}

var_dump( "Done" );

仅输出“完成”一词(Magento 1.6.1)。

我猜Magento的您的安装正在调用$ c-&gt; getItems();触发重新加载集合。因此,您删除所有项目,但是当您拨打第二个getItems时,将重新获取该集合。

答案 2 :(得分:4)

clear()类中有Varien_Data_Collection方法可以清除集合。

我不确定问题被提出时是否存在该方法,但它存在于Magento 1.7中

答案 3 :(得分:0)

$collection->clear()

应该做的工作。

答案 4 :(得分:0)

还可以在没有&#34;假装载的情况下删除所有项目。 (与Shay Acrich的答案相反):

class MyCollection extends SomeCollection {

    // ...

    public function setEmpty()
    {
        $this->clear();
        $this->_totalRecords = 0;
        $this->_setIsLoaded(true);
        return $this;
    }

    // ...

}

为了不允许_totalRecords方法重新加载集合,需要将0设置为getSize()

然而,需要扩展/修改集合的代码,因为字段_totalRecords和方法_setIsLoaded()都受到保护。

应该注意的是,如果特定集合忽略_totalRecords_isCollectionLoaded之类的标记,则上述解决方案可能无法按预期工作。