Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/05/2008, 11h00   #1
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Par défaut Suppression en cascade sur plusieurs niveaux

Salut,

J'ai plusieurs tables MySQL telles que :
"comment" dépend de "article", "article" dépend de "rubric", "rubric" dépend de blog.

Dans les classes modèles, les variables _dependantTables et _referenceMap sont faites pour représenter cette structure.

Les propriétés 'onDelete' des entrées de _referenceMap sont en "CASCADE".

Or, lorsque je fais :
Code :
1
2
$rubric = $rubricAdapter->find( $id )->current();
                $rubric->delete();
Les articles sont bien supprimés, mais pas les commentaires. De même si je supprime un blog, les rubriques sont supprimées, mais ni les articles ni les commentaires. Il semble qu'un seul niveau soit traité. Existe-t-il un moyen de régler ce problème, sans rajouter un lien dans la base de données entre tous les niveaux ?

Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2008, 14h15   #2
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Bonjour,

Citation:
Envoyé par Janitrix Voir le message
Existe-t-il un moyen de régler ce problème, sans rajouter un lien dans la base de données entre tous les niveaux ?
surcharger la méthode delete() de Zend_Db_Table ?

Pour moi, ce cas ressemble bien à un bug du framework (ou au moins une absence de fonctionnalité). En fait, quand tu appelles la méthode delete() de Zend_Db_Table_Row, cela déclenche la méthode _cascadeDelete des tables enfant. Cette méthode _cascadeDelete appele à son tour la méthode delete() de Zend_Db_Table. C'est ici qu'il y a à mon sens un oubli : il n'y a pas de vérification d'existence de tables dépendantes... D'ailleurs, si au lieu de passer par un Zend_Db_Table_Row pour faire ton delete, tu avais fait simplement un
Code :
$rubricAdapter->delete("mon_id = $id")
aucune autre table que rubric n'aurait été impactée...

Après, ce qui me semble compliqué dans la surcharge du delete() de Zend_Db_Table, c'est que pour utiliser le _cascadeDelete, il faudrait récupérer toutes les clés primaires des éléments supprimés...

Pour conclure, si j'avais besoin de cette fonctionnalité, je pense que j'essaierai autant que possible d'utiliser les fonctionnalités offertes par le SGBD plutôt que celles du framework (contraintes avec on delete cascade, triggers...).

Bon courage
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2008, 14h38   #3
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Merci de la réponse. Je viens de regarder le code ZF et ça semble en effet complexe de surcharger cette méthode. Je vais voir.
Merci
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 12h21   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
C'est le job du SGBD de conserver l'intégrité référentielle. Es-tu certain d'avoir bien mis les bonnes clefs, les bonnes contraintes où il faut ?
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 12h23   #5
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Citation:
Envoyé par Yogui Voir le message
C'est le job du SGBD de conserver l'intégrité référentielle. Es-tu certain d'avoir bien mis les bonnes clefs, les bonnes contraintes où il faut ?
J'ai une bdd MySQL donc pas d'intégrité référentielle. Je vais voir avec les tables innoDb, il parait qu'elles gèrent l'intégrité .
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 12h50   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Oui, avoir une base MySQL n'est pas une excuse. Le moteur InnoDB gère les sous requêtes, l'intégrité référentielle et les transactions depuis bien longtemps.

[Edit] Question de performances, obliger ZF à s'occuper de l'intégité signifie que tu envoies de très nombreuses requêtes à ta BDD, donc de nombreux allers-retours entre ton appli et ton SGBD, donc une très grosse perte de performances par rapport à l'intégrité gérée en interne par les contraintes de tes tables.

[Edit 2] Tutoriel MySQL : Limiter la complexité du code applicatif grâce au SGBD par Alain Defrance
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 13h06   #7
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Merci du lien
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 18h30   #8
Membre expérimenté
 
Avatar de hansaplast
 
Inscription : septembre 2005
Messages : 925
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : septembre 2005
Messages : 925
Points : 562
Points : 562
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// On récupère les retours d'erreurs du SGBD
        if(mysql_errno() == 1048) // un champ est vide
        {
		    $msg = explode('\'', mysql_error(), 3);
		    switch ($msg[1])
		    {
		    	case 'prenomClient':
		    		echo '[Erreur] Le prénom doit être saisie';
		    		break;
		    	case 'nomClient':
		    		echo '[Erreur] Le nom doit être saisie';
		    		break;
		    }
        }
vous avez deja essayé ce genre de code?

ca fait un peu peur non?
hansaplast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 18h53   #9
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Citation:
Envoyé par hansaplast Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// On récupère les retours d'erreurs du SGBD
        if(mysql_errno() == 1048) // un champ est vide
        {
		    $msg = explode('\'', mysql_error(), 3);
		    switch ($msg[1])
		    {
		    	case 'prenomClient':
		    		echo '[Erreur] Le prénom doit être saisie';
		    		break;
		    	case 'nomClient':
		    		echo '[Erreur] Le nom doit être saisie';
		    		break;
		    }
        }
vous avez deja essayé ce genre de code?

ca fait un peu peur non?
Non, je n'ai jamais essayé (et je ne vais le faire de suite ! ).
Mais quel est le lien avec ce sujet ?
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 18h54   #10
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Ce code est proposé dans l'article conseillé par Yogui
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 18h59   #11
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Citation:
Envoyé par Janitrix Voir le message
Ce code est proposé dans l'article conseillé par Yogui
Ah, ok, je ne comprenais pas d'où ça venait !
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 08h33   #12
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Citation:
Envoyé par hansaplast Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// On récupère les retours d'erreurs du SGBD
        if(mysql_errno() == 1048) // un champ est vide
        {
		    $msg = explode('\'', mysql_error(), 3);
		    switch ($msg[1])
		    {
		    	case 'prenomClient':
		    		echo '[Erreur] Le prénom doit être saisie';
		    		break;
		    	case 'nomClient':
		    		echo '[Erreur] Le nom doit être saisie';
		    		break;
		    }
        }
vous avez deja essayé ce genre de code?

ca fait un peu peur non?
Qu'est ce qui te gêne dans ce code ?
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2008, 02h38   #13
Membre expérimenté
 
Avatar de hansaplast
 
Inscription : septembre 2005
Messages : 925
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : septembre 2005
Messages : 925
Points : 562
Points : 562
Citation:
Envoyé par Janitrix Voir le message
Qu'est ce qui te gêne dans ce code ?
ce qui me gene c'est :
1- la dépendance envers les messages d'erreurs du moteur utilisé (je n'ai aucune idée de leur stabilité)
2- la dépendance envers le moteur de stockage a l'heure de PDO et autre.
3- la dependance envers les noms des colonnes.

et puis, plus globalement, le flou entre filtrage des entrées, soumission de la requête, et retours d'erreur de saisie.
hansaplast est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h35.


 
 
 
 
Partenaires

Hébergement Web