Як обрізати таблицю magento за допомогою колекції?


23

У мене є власна таблиця. Я хочу обрізати таблицю за допомогою колекції Magento без запиту SQL.

Сподіваюся, хтось надасть корисну інформацію.


Ви маєте на увазі, що хочете видалити деякі рядки на основі певної умови?
— Subesh Pokhrel

Ні, мені потрібно видалити всі записи, а також Auto Increment id починати з 1.
— VijayS91

Відповіді:


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();
}

Нижня частина цього полягає в тому, що він не скидає ідентифікаційний приріст таблиці. Але це безпечніше.

EDIT .
Щоб оновити ідентифікаційний приріст головної таблиці, ви можете додати новий метод у вашу модель ресурсів, який робить щось подібне.

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. Дивіться моє оновлення відповіді.
— Маріус

@Marius У мене є одні сумніви. то що таке плоска модель та модель EAV?
— MeenakshiSundaram R

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може бути корисним, якщо хтось хоче мати AI, починаючи з іншого значення.


Редагувати:

Це питання позначено тегом / ... просто для завершення відповіді:

  • changeTableAutoIncrement додано в 1.8.0.1
  • truncateTable додавали в 1.6.0.0-альфа1

-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

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