Як обрізати таблицю 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.