Problème de requète entre symfony et doctrine lors du save d'un formulaire embarqué
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 :
Code:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'
qui me renvoit sur (niveau logs) :
Code:
execute : INSERT INTO copisim_etudiant (anonyme, annee, id, fac, email_tmp, updated_at) VALUES (?, ?, ?, ?, ?, ?) - (0, TCEM1, 1, 13, , 2011-01-06)
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 ?
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 :
Code:
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 de formulaire (pas la plus clean du monde mais devrait quand même marcher) :
Code:
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);
}
} |
La classe actions :
Code:
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');
}
[...] |
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 !