Comment tronquer la table Magento en utilisant la collection?

23

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.

VijayS91
la source
Voulez-vous dire que vous souhaitez supprimer certaines lignes en fonction d'une condition?
Subesh Pokhrel
Non, je dois supprimer tous les enregistrements et également l'identifiant d'incrémentation automatique commence par 1.
VijayS91

Réponses:

18

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' truncateinstruction 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();
Marius
la source
2
pourriez-vous me dire trois types de modèles dans magento.thanks à l'avance
MeenakshiSundaram R
3
@MeenakshiSundaramR. Il y a le modèle d'entité. Exemple: 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.
Marius
2
@Marius Pouvez-vous me dire comment mettre à jour l'identifiant d'incrémentation automatique (ses moyens commencent par 1) disponible dans la collection magento.
VijayS91
2
@VijayS. Voir ma mise à jour de la réponse.
Marius
@Marius, j'ai un doute. alors qu'est-ce que le modèle plat et le modèle 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);

Remarque: MySQL réinitialise la valeur d'auto-incrémentation 1lors 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 / ... juste pour compléter la réponse:

  • changeTableAutoIncrement a été ajouté au 1.8.0.1
  • truncateTable a été ajouté dans 1.6.0.0-alpha1
sv3n
la source
-1

J'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();
}
Sapnandu
la source
1
Je demande de tronquer le tableau. Ne pas supprimer l'enregistrement.
VijayS91
vous pouvez le faire en utilisant le code suivant. si vous considérez la référence de code ci-dessus. $ items-> truncate ();
Sapnandu