Jak obciąć stół Magento za pomocą kolekcji?

23

Mam własny stół. Chcę obciąć tabelę przy użyciu kolekcji Magento bez zapytania SQL.

Mam nadzieję, że ktoś dostarczy użytecznych informacji.

VijayS91
źródło
Czy masz na myśli, że chcesz usunąć niektóre wiersze na podstawie określonych warunków?
Subesh Pokhrel
Nie, muszę usunąć wszystkie rekordy, a także identyfikator automatycznego przyrostu zaczyna się od 1.
VijayS91

Odpowiedzi:

18

Magento nie ma na to wsparcia (o ile mi wiadomo).
Ale możesz zaimplementować metodę w swoim modelu zasobów (nie w modelu zasobów kolekcji), która obetnie tabelę.
Coś takiego:

public function truncate() {
    $this->_getWriteAdapter()->query('TRUNCATE TABLE '.$this->getMainTable());
    return $this;
}

Następnie możesz wywołać go w kodzie:

Mage::getResourceModel('[module]/[entity]')->truncate();

Ale to bardzo niebezpieczne podejście. Do truncateprzerwy rachunku transakcji, więc nie może być wycofana w przypadku trzeba.
Zamiast tego sugeruję usunięcie każdego elementu w tabeli.

$collection = Mage::getModel('[module]/[entity]')->getCollection();
foreach ($collection as $item) {
    $item->delete();
}

Wadą tego jest to, że nie resetuje on identyfikatora przyrostu tabeli. Ale to jest bezpieczniejsze.

EDYCJA .
Aby zaktualizować identyfikator przyrostu tabeli głównej, możesz dodać nową metodę w modelu zasobów, która robi coś takiego.

public function changeAutoIncrement($increment = 1) {
    $this->_getWriteAdapter()->query('ALTER TABLE '.$this->getMainTable().' AUTO_INCREMENT = '. $increment);
}

Następnie wywołaj metodę w kodzie:

Mage::getResourceModel('[module]/[entity]')->changeAutoIncrement();
Marius
źródło
2
czy możesz mi powiedzieć trzy rodzaje modeli w magento. dzięki z góry
MeenakshiSundaram R
3
@MeenakshiSundaramR. Istnieje model encji. Przykład: Mage_Catalog_Model_Product. Istnieje model zasobów. Przykład: Mage_Catalog_Model_Resource_Product. I istnieje model zasobów kolekcji Mage_Catalog_Model_Resource_Product_Collection.
Marius
2
@Marius Czy możesz mi powiedzieć Jak zaktualizować identyfikator automatycznego przyrostu (czyli zacząć od 1) dostępny w kolekcji magento.
VijayS91
2
@VijayS. Zobacz moją aktualizację odpowiedzi.
Marius
@Marius mam jedną wątpliwość. czym jest model płaski i model 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);

Uwaga: MySQL resetuje wartość autoinkrementacji do 1skrótu tabeli, więc nie jest to wymagane, ale changeTableAutoIncrementmoże być przydatne, jeśli ktoś chce mieć AI zaczynającą się od innej wartości.


Edytować:

To pytanie zostało oznaczone tagiem / ... tylko w celu uzupełnienia odpowiedzi:

  • changeTableAutoIncrement został dodany w 1.8.0.1
  • truncateTable został dodany w wersji 1.6.0.0-alfa1
sv3n
źródło
-1

Mam model i dla pewnego rozwoju musiałem zaimplementować metodę delete. To bardzo łatwe. Próbuję również usunąć warunkowego, ale nie otrzymałem dokładnego kodu. Ale używam następującego kodu, który spełni twoje wymagania dotyczące warunkowego usunięcia.

$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
źródło
1
Pytam o obcięcie stołu. Nie należy usuwać rekordu.
VijayS91
możesz to zrobić za pomocą następującego kodu. jeśli weźmiesz pod uwagę powyższe odniesienie do kodu. $ items-> truncate ();
Sapnandu