Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'ai une table dont sa clé primaire correspond à une clé étrangère dans une autre table. Lorsque j'écris cette ligne :
$where = 'ID_STRUCTURE = ' . $id_structure; $rows_affected = $this->structure->delete($where);
j'obtiens le message suivant
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 :
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
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
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
lors de la création de la clé étrangère, tu spécifies l'attribut on delete cascade
Hors ligne
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
voici l'erreur que j'ai :
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
Voilà la ligne
$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
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 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