Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-02-2008 14:05:22

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Table->Delete en cascade ?

Bonjour,

J'ai une table dont sa clé primaire correspond à une clé étrangère dans une autre table. Lorsque j'écris cette ligne :

Code:

$where = 'ID_STRUCTURE = ' . $id_structure;
                $rows_affected = $this->structure->delete($where);

j'obtiens le message suivant

Code:

Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HY000]: General error: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`location/appartement`, CONSTRAINT `appartement_ibfk_1` FOREIGN KEY (`ID_STRUCTURE`) REFERENCES `structure` (`ID_STRUCTURE`))' in

J'ai 2 tables : appartement et structure, une structure ayant plusieurs appartement. Chacune de ses tables sont instanciés par des classes dérivés de Zend_Db_Table_Abstract


Effectivement une clé étrangère a été défini dans un fichier "appartement" de la manière suivante :

Code:

 protected $_referenceMap    = array('Structure'    => array(
                                            'columns'        =>    array('ID_STRUCTURE'),
                                            'refTableClass'    =>    'Structure',
                                            'refColumns'    =>    array('ID_STRUCTURE')));

Je pense que cette relation créer cette erreur fatal mais je ne sais pas comment réaliser le Delete() sinon.

Existe-il une solution ?

Merci

Hors ligne

 

#2 29-02-2008 14:49:58

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: Table->Delete en cascade ?

Bonjour,

Quand tu as des relations comme celles-ci, il y a un ordre de suppression à respecter.
Tu dois impérativement commencer par supprimer les enregistrements dans la table relié avant de supprimer l'enregistrement lui-même.

Dans ton exemple, il faut que tu supprimes tous les appartements rattachés à ta structure AVANT de supprimer ta structure elle-même, sinon, erreur de liaison.

Geoffrey

Hors ligne

 

#3 29-02-2008 15:16:39

ndesaleux
Membre
Date d'inscription: 16-04-2007
Messages: 196
Site web

Re: Table->Delete en cascade ?

Tu peux gérer à plusieurs niveaux (soit au niveau de ta BDD soit la requete de suppression est effectuée par PHP)

Perso, je trouverai plus propre de leur faire au niveau BDD

Hors ligne

 

#4 29-02-2008 15:28:37

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: Table->Delete en cascade ?

ndesaleux a écrit:

Tu peux gérer à plusieurs niveaux (soit au niveau de ta BDD soit la requete de suppression est effectuée par PHP)
Perso, je trouverai plus propre de leur faire au niveau BDD

Comment tu fais au niveau de la BDD ? tu passes par une procédure stockée où il y a encore mieux ?

Geoffrey

Hors ligne

 

#5 29-02-2008 16:39:55

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Table->Delete en cascade ?

lors de la création de la clé étrangère, tu spécifies l'attribut on delete cascade

Hors ligne

 

#6 03-03-2008 07:38:06

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: Table->Delete en cascade ?

Est-tu sur que Zend Framework gère la suppression en cascade ?
Dois-je penser au full loader de ZF ?
J'utilise MYSQL comme bdd et Windesign pour modéliser ma table, je vais vérifier mais je crois que par défaut la suppression se fait en cascade.

Hors ligne

 

#7 03-03-2008 10:26:23

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: Table->Delete en cascade ?

TiTerm a écrit:

lors de la création de la clé étrangère, tu spécifies l'attribut on delete cascade

Formidable astuce, il faut que j'essai très vite ce truc

Hors ligne

 

#8 03-03-2008 11:40:52

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: Table->Delete en cascade ?

voici l'erreur que j'ai :

Code:

Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 
'SQLSTATE[HY000]: General error: 1451 Cannot delete or update a parent row: a foreign key constraint fails
 (`location/locataire`, CONSTRAINT `locataire_ibfk_1` FOREIGN KEY (`ID_PRETENDANT`) REFERENCES 
`pretendant` (`ID_PRETENDANT`))' in C:\wamp\www\location\library_1.5\Zend\Db\Statement\Pdo.php:238 
Stack trace: #0 C:\wamp\www\location\library_1.5\Zend\Db\Statement.php(283): 
Zend_Db_Statement_Pdo->_execute(Array) #1 
C:\wamp\www\location\library_1.5\Zend\Db\Adapter\Abstract.php(406): Zend_Db_Statement->execute(Array) 
#2 C:\wamp\www\location\library_1.5\Zend\Db\Adapter\Pdo\Abstract.php(206): 
Zend_Db_Adapter_Abstract->query('DELETE FROM `pr...', Array) #3 
C:\wamp\www\location\library_1.5\Zend\Db\Adapter\Abstract.php(553): 
Zend_Db_Adapter_Pdo_Abstract->query('DELETE FROM `pr...') #4 
C:\wamp\www\location\library_1.5\Zend\Db\Table\Abstract.php(880): 
Zend_Db_Adapter_Abstract->delete('pretendant', 'ID_PRETENDANT =...') #5 
C:\wamp\www\location\application\pr in C:\wamp\www\location\library_1.5\Zend\Db\Statement\Pdo.php on line 238

Peut-être que je dois redéfinir la fonction delete ?

Dernière modification par whitespirit (03-03-2008 11:41:29)

Hors ligne

 

#9 03-03-2008 14:09:48

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: Table->Delete en cascade ?

dans quel ordre fais-tu tes requetes ?

Hors ligne

 

#10 05-03-2008 06:13:24

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: Table->Delete en cascade ?

Voilà la ligne

Code:

$where = 'ID_PRETENDANT = ' . $id_pretendant;
$rows_affected = $this->pretendant->delete($where);

C'est simple, je récupère l'id passé par POST et après les tests, je l'efface.
PS: pour reprendre mon exemple de début : la table prétendant à une clé primaire. Cette clé primaire correspond à une clé étrangère dans la table locataire. Du coup, si j'ai un locataire, je ne peux pas supprimer automatiquement par delete() le pretendant. (houaaaa, j'étais à cours d'inspiration quand j'ai créé cette table, et puis, c'était vers la St Valentin, mais c'est vrai que c'est nul d'avoir une table nommé Prétendant).

Hors ligne

 

#11 05-03-2008 16:15:28

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: Table->Delete en cascade ?

Salut,

whitespirit a écrit:

Du coup, si j'ai un locataire, je ne peux pas supprimer automatiquement par delete() le pretendant.

Tu viens de répondre tout seul smile il te faut 2 requêtes. la premiere tu vires tout tes locataires avec un WHERE id_pretendant=$id_pretendant et la deuxieme, tu vires ton prétendant maintenant qu'il est "libéré"

Si tu ne le fais pas dans cet ordre, erreur.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages