Bonjour,
J'ai un formulaire qui rassemble une classe doctrine et ses relations (one-to-many). Au moment du save(), je me retrouve avec un :
qui me renvoit sur (niveau logs) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'
L'erreur est normale, vu qu'il veut insérer l'utilisateur courant qui édite son formulaire. La question, à laquelle je n'arrive pas à répondre, c'est : pourquoi Symfony envoie-t-il un INSERT au lieu d'un UPDATE à Doctrine ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part execute : INSERT INTO copisim_etudiant (anonyme, annee, id, fac, email_tmp, updated_at) VALUES (?, ?, ?, ?, ?, ?) - (0, TCEM1, 1, 13, , 2011-01-06)
J'ai vérifié avec WebDevelopper, les champs du formulaire sont correctement présents et remplis (notamment l'Id de l'utilisateur). J'ai dû rater un truc mais là je sèche depuis un moment...
Le schéma :
La classe de formulaire (pas la plus clean du monde mais devrait quand même marcher) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 CopisimEtudiant: actAs: Timestampable: created: { disabled: true } updated: { format: Y-m-d } columns: nom: { type: string(50), notnull: true } prenom: { type: string(50), notnull: true } fac: { type: integer, notnull: true } naissance: { type: date } email: { type: string(100), notnull: false } email_tmp: { type: string(100), notnull: false } anonyme: { type: boolean, notnull: true, default: 0 } annee: { type: enum, values: ['DCEM4', 'DCEM4 doublant', 'TCEM1'], default: 'DCEM4' } classement: { type: integer, notnull: true } relations: CopisimFac: { local: fac, foreign: id } CopisimChoix: actAs: Timestampable: ~ columns: etudiant: { type: integer, notnull: true } poste: { type: integer, notnull: true } ordre: { type: integer(2), notnull: true } relations: CopisimEtudiant: { local: etudiant, foreign: classement } CopisimPoste: { local: poste, foreign: id } [...]
La classe actions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 class CopisimEtudiantChoixForm extends BaseCopisimEtudiantForm { public function configure() { unset($this['nom'], $this['prenom'], $this['naissance'], $this['email'], $this['adresse'], $this['classement'], $this['created_at'], $this['updated_at']); $this->widgetSchema['fac'] = new sfWidgetFormInputHidden(); $this->widgetSchema['anonyme'] = new sfWidgetFormInputHidden(); $this->widgetSchema['email_tmp'] = new sfWidgetFormInputHidden(); $this->widgetSchema['annee'] = new sfWidgetFormInputHidden(); $this->embedRelation('CopisimChoix'); $newChoix = new CopisimChoixForm(); $newChoix->setDefault('etudiant', $this->object->id); $this->embedForm('ajouter', $newChoix); } protected function doBind(array $values) { if ('' === trim($values['ajouter']['poste']) && '' === trim($values['ajouter']['ordre'])) { unset($values['ajouter'], $this['ajouter']); } parent::doBind($values); } }
Je n'ai pas mis le reste, vu que ça n'apporte pas grand chose au problème... Concrètement, c'est ma classe de formulaire que je serais le plus enclin à mettre en doute, mais en pratique je ne comprends pas pour autant l'erreur entre INSERT et UPDATE. Si quelqu'un a une idée, merci d'avance !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 [...] public function executeEditchoix(sfWebRequest $request) { $this->user = $this->getUser()->getUsername(); $this->forward404Unless($copisim_etudiant = Doctrine::getTable('CopisimEtudiant')->find(array('id' => $this->getUser()->getUsername())), sprintf('Utilisateur inconnu : (%s).', $this->getUser()->getUsername())); $this->form = new CopisimEtudiantChoixForm($copisim_etudiant); } public function executeUpdatechoix(sfWebRequest $request) { $this->user = $this->getUser()->getUsername(); $this->forward404Unless($request->isMethod(sfRequest::POST)); $this->form = new CopisimEtudiantChoixForm(); $this->form->bind($request->getParameter($this->form->getName()), $request->getFiles($this->form->getName())); if($this->form->isValid()) { $this->form->save(); $this->redirect('etudiant/editchoix'); } $this->setTemplate('editchoix'); } [...]
Partager