Как удалить все элементы из коллекции продуктов magento? - PullRequest
8 голосов
/ 10 декабря 2011

Кажется, не работает:

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

?>

$ коллекция все еще заполнена

Ответы [ 5 ]

13 голосов
/ 28 ноября 2013

Если вы хотите работать с пустой коллекцией, лучше всего загрузить ее с фильтром, который всегда будет создавать пустой набор. Вот пример:

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

Поскольку идентификаторы продуктов Magento начинаются с 1, эта коллекция будет оставаться пустой, пока вы не добавите в нее элементы с помощью метода addItem ().

clear () и removeItemByKey (), с другой стороны, будут запускать только второй запуск базы данных для повторного получения данных, которые вам там не нужны.

7 голосов
/ 11 декабря 2011

Ваш вопрос не имеет смысла.Запуск следующего кода

$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" );

приводит к выводу только слова "done" (Magento 1.6.1).

Я думаю, что-то о вашей установке изMagento выполняет вызов $ c-> getItems ();вызвать перезагрузку коллекции.Итак, вы удаляете все элементы, но затем, когда вы вызываете свой второй getItems, коллекция обновляется.

4 голосов
/ 07 января 2013

В классе Varien_Data_Collection есть метод clear(), который очищает коллекцию.

Я не уверен, существует ли метод в то время, когда был задан вопрос, но он существует в Magento 1.7

0 голосов
/ 01 июня 2017

Существует также возможность удалить все элементы без «поддельной загрузки» (в противоположность ответу Шей Акрич):

class MyCollection extends SomeCollection {

    // ...

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

    // ...

}

Требуется установка _totalRecords в 0, чтобы не допуститьgetSize() метод для перезагрузки коллекции.

Тем не менее, необходимо расширить / изменить код коллекции, поскольку защищено как поле _totalRecords, так и метод _setIsLoaded().

ТамСледует отметить, что если конкретная коллекция игнорирует флаги, такие как _totalRecords и _isCollectionLoaded, приведенное выше решение может работать не так, как ожидалось.

0 голосов
/ 14 октября 2013
$collection->clear()

должен сделать работу.

...