【问题标题】:How to remove all items in a magento product collection?如何删除 magento 产品集合中的所有项目?
【发布时间】:2011-12-10 00:22:40
【问题描述】:

似乎不起作用:

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

?>

$collection 仍然被填充

【问题讨论】:

  • 删除是一个太模糊的动作。你想在这里做什么?从集合中删除项目以便下次迭代时它们不存在,或者删除它们以便它们从系统中消失?
  • 只是从收藏中删除,仅此而已。
  • 是什么让你觉得它不起作用?
  • &lt;?php foreach($collection-&gt;getItems() as $key =&gt; $_product){ //product echo $_product-&gt;getName(); //returns "my product name" } ?&gt;之后添加

标签: collections magento


【解决方案1】:

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

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

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

另一方面,clear() 和 removeItemByKey() 只会触发对数据库的第二次运行以重新获取您不需要的数据。

【讨论】:

  • 到目前为止,你的答案是最好的。糟透了,有些傻瓜得到了绿色复选标记,以表示不起作用的答案。
  • removeItemByKey() 不会触发第二次从数据库中获取数据。它只是简单地按键取消设置内部数据数组。
  • clear() 不会对其自身触发第二次提取,但它将集合的 loaded 状态设置为 false,因此集合类中调用“加载”方法的任何方法将触发 fetch。
  • @AnatolyA.Kazantsev 所以如果我这样做:$coll=$this-&gt;getLoadedProductCollection(); $coll-&gt;clear-&gt;addAttributeToFilter('my_attr',array('like'=&gt;'55'))-&gt;load(); 会为我的收藏添加一个属性到过滤器吗?还是会因为首次加载集合时未使用添加的属性而被忽略?
【解决方案2】:

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

$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->getItems();触发集合的重新加载。因此,您删除了所有项目,但是当您调用第二个 getItems 时,将重新获取该集合。

【讨论】:

  • 为什么第二个getItems 触发抓取?它调用load,然后load 通过调用isLoaded 检查是否加载了集合。但是removeItemByKey 不会重置该标志。还是我错过了什么?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    还有可能在没有“虚假加载”的情况下删除所有项目(与 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 等标志,上述解决方案可能无法按预期工作。

    【讨论】:

      【解决方案5】:
      $collection->clear()
      

      应该做的工作。

      【讨论】:

        猜你喜欢
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多