Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
je suis confronté à un problème que j'ai du mal à comprendre. J'ai une fonction où j'effectue une transaction et lors d'une sauvegarde d'une entité, j'ai une erreur SQL qui me dit que j'ai une duplicate entry pour la clé primaire alors que la table est vide !!!
Voici comment je procède au niveau de cette fonction :
[lang=php] // $db est une instance de EntityManager::getConnection() // Je check les données récupérées. Si elles ne sont pas bonnes ou manquantes => $error = false, sinon $error = true; $db->beginTransaction(); try { // traitements sur les entités //... // Je récupère une instance de ma classe $m if ($m->save($entity) === null) { $error = true; } } catch (Exception $e) { // je récupère l'exception et je la logge } if ($error) { $db->rollBack(); } else { $db->commit(); }
Mon code au niveau de la fonction save est ni plus ni moins d'un enchainement de persist() et flush() :
[lang=php] public function save($entity) { $id = null; try { $this->_getEm()->persist($entity); $this->_getEm()->flush(); $id = 1; } catch (Exception $e) { } return $id; }
L'entity où j'ai ce problème est une entité qui représente une table de liaison entre deux autres entités. Dans ce cas présent, je n'ai pas mappé les liaisons au niveau des deux autres entités, donc théoriquement, doctrine ne devrait pas savoir que cette entité est une "entité de liaison".
Une idée pour résoudre ce problème ?
Merci d'avance,
Romain
Hors ligne
Bonjour,
Si tu as une transaction, et que tu as une erreur de duplicate entry, de ce que je vois dans ton code c'est normal que ta base soit vide puisque tu fait un rollback en cas d'erreur.
Transaction -> Erreur -> rollback -> base vide.
Tu dois identifier a quel moment dans ton code tu gère tes relations. Le problème viens surement d'un index unique, ou d'une clé primaire qui apparaît deux fois.
Hors ligne
Je me suis mal exprimé !
Quand je fais cette transaction, j'ai, au début, une base vide. Ensuite, la base se remplit bien avec les données que j'injecte dans cette fonction. J'ai cette erreur mais pas de rollback.
Si je commente la ligne incriminée (je l'ai parfaitement identifiée), tout se passe bien.
Ce que je ne comprends pas c'est pourquoi, j'ai cette erreur alors que la base est vide avant la transaction ! On dirait que cette entrée est sauvegardée deux fois mais c'est impossible au vu de mon code...
Hors ligne