J'ai une table personnalisée. Je veux tronquer la table à l'aide de la collection Magento sans requête SQL.
J'espère que quelqu'un vous fournira des informations utiles.
J'ai une table personnalisée. Je veux tronquer la table à l'aide de la collection Magento sans requête SQL.
J'espère que quelqu'un vous fournira des informations utiles.
Réponses:
Magento n'a pas de support pour cela (pour autant que je sache).
Mais vous pouvez implémenter une méthode dans votre modèle de ressource (pas le modèle de ressource de collection) qui tronquera la table.
Quelque chose comme ça:
public function truncate() {
$this->_getWriteAdapter()->query('TRUNCATE TABLE '.$this->getMainTable());
return $this;
}
Ensuite, vous pouvez l'appeler dans votre code:
Mage::getResourceModel('[module]/[entity]')->truncate();
Mais c'est une approche très dangereuse. L' truncate
instruction interrompt la transaction, elle ne peut donc pas être annulée au cas où vous en auriez besoin.
Je suggère à la place de supprimer toutes les entités du tableau.
$collection = Mage::getModel('[module]/[entity]')->getCollection();
foreach ($collection as $item) {
$item->delete();
}
L'inconvénient est qu'il ne réinitialise pas l'ID d'incrément de la table. Mais c'est plus sûr.
MODIFIER .
Pour mettre à jour l'ID d'incrémentation de la table principale, vous pouvez ajouter une nouvelle méthode dans votre modèle de ressource qui fait quelque chose comme ça.
public function changeAutoIncrement($increment = 1) {
$this->_getWriteAdapter()->query('ALTER TABLE '.$this->getMainTable().' AUTO_INCREMENT = '. $increment);
}
Appelez ensuite votre méthode dans le code:
Mage::getResourceModel('[module]/[entity]')->changeAutoIncrement();
Mage_Catalog_Model_Product
. Il y a le modèle de ressource. Exemple: Mage_Catalog_Model_Resource_Product
. Et il y a le modèle de ressource de collection 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);
Remarque: MySQL réinitialise la valeur d'auto-incrémentation 1
lors de la troncature d'une table, donc ce n'est pas obligatoire, maischangeTableAutoIncrement
peut être utile si quelqu'un veut que l'IA commence par une autre valeur.
Modifier:
Cette question a été taguée avec magento-1.7 / magento-1.8 ... juste pour compléter la réponse:
changeTableAutoIncrement
a été ajouté au 1.8.0.1truncateTable
a été ajouté dans 1.6.0.0-alpha1J'ai créé un modèle et pour certains développements j'ai dû implémenter la méthode de suppression. C'est très facile. J'essaie également de supprimer conditionnellement mais je n'ai pas obtenu le code exact. Mais j'utilise le code suivant qui répondra à votre exigence de suppression conditionnelle.
$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();
}