似乎不起作用:
<?php
$collection = Mage::getModel('catalog/product')->getCollection();
foreach($collection->getItems() as $key => $_product){
//product
$collection->removeItemByKey($key);
}
?>
$ collection仍然填充
答案 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
之类的标记,则上述解决方案可能无法按预期工作。