У меня есть пользовательский стол. Я хочу обрезать таблицу с помощью коллекции Magento без SQL-запроса.
Надеюсь, кто-нибудь предоставит полезную информацию.
У меня есть пользовательский стол. Я хочу обрезать таблицу с помощью коллекции Magento без SQL-запроса.
Надеюсь, кто-нибудь предоставит полезную информацию.
Ответы:
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();
Mage_Catalog_Model_Product
. Есть модель ресурса. Пример: Mage_Catalog_Model_Resource_Product
. И есть модель коллекции ресурсов Mage_Catalog_Model_Resource_Product_Collection
.
$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
может быть полезно, если кто-то хочет, чтобы ИИ начинался с другого значения.
Редактировать:
Этот вопрос был помечен magento-1.7 / magento-1.8 ... просто чтобы завершить ответ:
changeTableAutoIncrement
был добавлен в 1.8.0.1truncateTable
был добавлен в 1.6.0.0-alpha1Я создал модель, и для разработки мне пришлось реализовать метод удаления. Это очень просто. Я также пытаюсь условно удалить, но я не получил точный код. Но я использую следующий код, который будет выполнять ваше требование для условного удаления.
$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();
}