Wie schneide ich eine Magento-Tabelle mit Hilfe der Sammlung ab?

23

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.

VijayS91
quelle
Meinen Sie damit, dass Sie einige Zeilen aufgrund einer bestimmten Bedingung löschen möchten?
Subesh Pokhrel
Nein, ich muss alle Datensätze löschen und auch die Auto-Inkrement-ID beginnt mit 1.
VijayS91

Antworten:

18

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 truncateAnweisung 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();
Marius
quelle
2
Könnten Sie mir drei Arten von Modellen in magento.thanks im Voraus sagen
MeenakshiSundaram R
3
@MeenakshiSundaramR. Es gibt das Entitätsmodell. Beispiel: 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.
Marius
2
@Marius Kannst du mir sagen, wie ich die in magento collection verfügbare Auto-Inkrement-ID aktualisiere?
VijayS91
2
@VijayS. Siehe mein Update zur Antwort.
Marius
@ Marius Ich habe einen Zweifel. Was ist dann Flat-Modell und EAV-Modell?
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);

Hinweis: MySQL setzt den Wert für die automatische Inkrementierung auf den Wert zurück, 1wenn eine Tabelle abgeschnitten wird. Dies ist daher nicht erforderlich, changeTableAutoIncrementkann jedoch nützlich sein, wenn eine KI mit einem anderen Wert beginnen soll.


Bearbeiten:

Diese Frage wurde mit / ... um die Antwort zu vervollständigen:

  • changeTableAutoIncrement wurde in 1.8.0.1 hinzugefügt
  • truncateTable wurde in 1.6.0.0-alpha1 hinzugefügt
sv3n
quelle
-1

Ich 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();
}
Sapnandu
quelle
1
Ich frage nach dem Abschneiden der Tabelle. Datensatz nicht löschen.
VijayS91
Sie können den folgenden Code verwenden. wenn Sie die obige Code-Referenz berücksichtigen. $ items-> truncate ();
Sapnandu