Как усечь таблицу magento, используя коллекцию?


23

У меня есть пользовательский стол. Я хочу обрезать таблицу с помощью коллекции Magento без SQL-запроса.

Надеюсь, кто-нибудь предоставит полезную информацию.


Вы имеете в виду, что хотите удалить несколько строк на основе какого-либо условия?
Субеш Покхрел

Нет, мне нужно удалить все записи, а также идентификатор
автоинкремента,

Ответы:


18

Magento не имеет поддержки для этого (насколько я знаю).
Но вы можете реализовать метод в своей модели ресурсов (не модель ресурсов коллекции), который будет усекать таблицу.
Что-то вроде этого:

public function truncate() {
    $this->_getWriteAdapter()->query('TRUNCATE TABLE '.$this->getMainTable());
    return $this;
}

Тогда вы можете назвать это в своем коде:

Mage::getResourceModel('[module]/[entity]')->truncate();

Но это очень опасный подход. В truncateбрейки заявлении сделка, поэтому он не может быть откат в случае , если вам нужно.
Вместо этого я предлагаю удалить все объекты в таблице.

$collection = Mage::getModel('[module]/[entity]')->getCollection();
foreach ($collection as $item) {
    $item->delete();
}

Недостатком является то, что он не сбрасывает идентификатор приращения таблицы. Но это безопаснее.

РЕДАКТИРОВАТЬ .
Чтобы обновить идентификатор приращения основной таблицы, вы можете добавить новый метод в модель ресурсов, который выполняет что-то вроде этого.

public function changeAutoIncrement($increment = 1) {
    $this->_getWriteAdapter()->query('ALTER TABLE '.$this->getMainTable().' AUTO_INCREMENT = '. $increment);
}

Затем вызовите ваш метод в коде:

Mage::getResourceModel('[module]/[entity]')->changeAutoIncrement();

2
Не могли бы вы рассказать мне о трех типах моделей в magento.Спасибо заранее
MeenakshiSundaram R

3
@MeenakshiSundaramR. Есть модель сущности. Пример: Mage_Catalog_Model_Product. Есть модель ресурса. Пример: Mage_Catalog_Model_Resource_Product. И есть модель коллекции ресурсов Mage_Catalog_Model_Resource_Product_Collection.
Мариус

2
@Marius Можете ли вы сказать мне, как обновить идентификатор автоинкремента (его значение начинается с 1), доступный в коллекции magento.
VijayS91

2
@VijayS. Смотрите мое обновление к ответу.
Мариус

@Мариус, у меня есть одно сомнение. тогда что такое модель Flat и модель EAV?
МинакшиСундарам Р

11
$model = Mage::getModel('[module]/[model]');
$resource = $model->getResource();
$connection = $resource->getReadConnection();
/* @see Varien_Db_Adapter_Pdo_Mysql */
$connection->truncateTable($resource->getMainTable());
$connection->changeTableAutoIncrement($resource->getMainTable(), 1);

Примечание. MySQL сбрасывает значение автоинкремента 1при усечении таблицы, поэтому это не требуется, но changeTableAutoIncrementможет быть полезно, если кто-то хочет, чтобы ИИ начинался с другого значения.


Редактировать:

Этот вопрос был помечен / ... просто чтобы завершить ответ:

  • changeTableAutoIncrement был добавлен в 1.8.0.1
  • truncateTable был добавлен в 1.6.0.0-alpha1

-1

Я создал модель, и для разработки мне пришлось реализовать метод удаления. Это очень просто. Я также пытаюсь условно удалить, но я не получил точный код. Но я использую следующий код, который будет выполнять ваше требование для условного удаления.

$items = Mage::getModel('custom/csaabandonedcart')->getCollection()
    ->addFieldToFilter('csa_id',Mage::getSingleton('customer/session')
    ->getCustomerId())->addFieldToFilter('customer_id', $retailer)
    ->addFieldToFilter('product_id', $spid);

foreach ($items as $item) {
        $item->delete();
}

1
Я спрашиваю об усечении таблицы. Не удалять запись.
VijayS91

Вы можете сделать, используя следующий код. если вы считаете приведенный выше код ссылки. $ изделия-> усечение ();
Сапнанду
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.