Ich habe eine benutzerdefinierte Tabelle. Ich möchte die Tabelle mit der Magento-Sammlung ohne SQL-Abfrage abschneiden .
Hoffe, jemand wird einige nützliche Informationen liefern.
Ich habe eine benutzerdefinierte Tabelle. Ich möchte die Tabelle mit der Magento-Sammlung ohne SQL-Abfrage abschneiden .
Hoffe, jemand wird einige nützliche Informationen liefern.
Antworten:
Magento hat keine Unterstützung dafür (soweit ich weiß).
Sie können jedoch in Ihrem Ressourcenmodell eine Methode implementieren (nicht das Auflistungsressourcenmodell), die die Tabelle abschneidet.
Etwas wie das:
public function truncate() {
$this->_getWriteAdapter()->query('TRUNCATE TABLE '.$this->getMainTable());
return $this;
}
Dann können Sie es in Ihrem Code aufrufen:
Mage::getResourceModel('[module]/[entity]')->truncate();
Dies ist jedoch ein sehr gefährlicher Ansatz. Die truncate
Anweisung bricht die Transaktion ab, sodass bei Bedarf kein Rollback durchgeführt werden kann.
Ich empfehle stattdessen, alle Entitäten in der Tabelle zu löschen.
$collection = Mage::getModel('[module]/[entity]')->getCollection();
foreach ($collection as $item) {
$item->delete();
}
Dies hat den Nachteil, dass die Inkrement-ID der Tabelle nicht zurückgesetzt wird. Aber es ist sicherer.
BEARBEITEN .
Um die Inkrement-ID der Haupttabelle zu aktualisieren, können Sie Ihrem Ressourcenmodell eine neue Methode hinzufügen, die so etwas tut.
public function changeAutoIncrement($increment = 1) {
$this->_getWriteAdapter()->query('ALTER TABLE '.$this->getMainTable().' AUTO_INCREMENT = '. $increment);
}
Rufen Sie dann Ihre Methode im Code auf:
Mage::getResourceModel('[module]/[entity]')->changeAutoIncrement();
Mage_Catalog_Model_Product
. Es gibt das Ressourcenmodell. Beispiel: Mage_Catalog_Model_Resource_Product
. Und da ist das Sammlungsressourcenmodell 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);
Hinweis: MySQL setzt den Wert für die automatische Inkrementierung auf den Wert zurück, 1
wenn eine Tabelle abgeschnitten wird. Dies ist daher nicht erforderlich, changeTableAutoIncrement
kann jedoch nützlich sein, wenn eine KI mit einem anderen Wert beginnen soll.
Bearbeiten:
Diese Frage wurde mit magento-1.7 / magento-1.8 getaggt ... um die Antwort zu vervollständigen:
changeTableAutoIncrement
wurde in 1.8.0.1 hinzugefügttruncateTable
wurde in 1.6.0.0-alpha1 hinzugefügtIch habe ein Modell erstellt und für einige Entwicklungen musste ich eine Löschmethode implementieren. Es ist sehr leicht. Ich versuche auch das bedingte Löschen, aber ich habe keinen genauen Code erhalten. Ich verwende jedoch den folgenden Code, der Ihre Anforderung für das bedingte Löschen erfüllt.
$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();
}