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 : Sélectionner tout - Visualiser dans une fenêtre à part
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'
qui me renvoit sur (niveau logs) :
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)
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 : 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 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
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 : 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');
  }
 
[...]
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 !