Suppression en cascade avec cakephp
Si vous avez un e-commerce (sous cakephp), vous avez donc des produits. Ces produits ont surement des photos, des commentaires, des notes etc…
Que se passe t-il si un jour vous devez supprimer tout ce qui touche à un produit tout en gardant une bdd cohérente?
Sur votre action delete_produit, vous allez devoir récupérer toutes les photos, commentaires, notes etc… concernant ce produit et vous allez devoir les supprimer 1 par 1 dans une boucle.
Votre action va ressembler à quelque chose comme ça:
public function admin_del_produit($id=null) { $this->loadModel('Photo'); $this->loadModel('Note'); $this->Produit->id = $id; if (!$this->Produit->exists()) { throw new NotFoundException(__('Produit invalide')); } // on recupere ttes les photos $photos = $this->Photo->find('all', array('conditions' => array('Photo.produit_id' => $id) )); // on recupere ttes les notes $notes= $this->Note->find('all', array('conditions' => array('Note.produit_id' => $id) )); // si on del le produit on del ttes les photos et les notes if($this->Produit->delete($id)) { foreach ($photos as $key => $value) { $id_photo=$value['Photo']['id']; $name_hash=$value['Photo']['name_hash']; $dossier = WWW_ROOT.'img/galerie'; if($this->Photo->delete($id_photo)) { $this->Session->setFlash('Supp ok',"notice", array('type'=>'success')); unlink($dossier.'/'.$name_hash); } } foreach ($notes as $key => $value) { $id_note=$value['Note']['id']; if($this->Note->delete($id_note)) { $this->Session->setFlash('Supp ok',"notice", array('type'=>'success')); } } $this->redirect(array('action'=>'index')); } else { $this->Session->setFlash('Supp failed',"notice", array('type'=>'danger')); $this->redirect(array('action'=>'index')); } }
Bref, c’est long, vous pouvez oublier, vous tromper etc… Et si je vous disais qu’en 1 ligne vous pouvez supprimer tout ce que vous souhaitez sans vous préoccuper de quoique ce soit.
Suppression en cascade avec cakephp
Avec cakephp, vous pouvez supprimer en cascade tout comme en mysql. En mysql, vous pouvez utiliser « ON DELETE CASCADE » comme ceci lorsque vous créez votre table notes (si on reprend l’exemple de tout à l’heure) :
CREATE TABLE notes ( [...] FOREIGN KEY (produit_id) REFERENCES produits (produit_id) ON DELETE CASCADE ) ENGINE=InnoDB;
Bon, le principe de cet article n’est pas de voir comment le faire en mysql pur mais en cakephp 😀
Donc vous pouvez reproduire le même comportement en cakephp à l’aide de l’attribut de modèle « dependent ». Si on reprend l’exemple des produits :
class Produit extends AppModel { public $name = 'Produit'; public $hasMany=array( 'Photo' => array( 'className' => 'Photo', 'foreignKey'=>'id_produit', 'dependent'=>true, ), 'Note' => array( 'className' => 'Note', 'foreignKey'=>'id_produit', 'dependent'=>true, ), ); }
Comme vous l’avez compris, ce code est à mettre dans votre modèle Produit.
En mettant la clé « dependent » à « true », vous permettez la suppression en cascade (donc automatique) de tous les informations des modèles liés.
Vous savez désormais supprimer en cascade tous les dépendances liées à un modèle cakephp.
Si vous avez apprécié cet article, n’hésitez pas à le partager sur les réseaux sociaux et/ou de laisser un commentaire ci dessous.
Bon dev à vous 😉