Problème de sauvegarde des données avec embed form
	
	
		Hello,
J'essaie de maîtriser un minimum symfony mais je suis bloquée au niveau des embed forms et de l'enregistrement des données quand il s'agit de relations n:n.
J'ai une table Jeux, une table Genre et une table JeuxHasGenre (avec comme colonnes: jeux_id_jeux et genre_id_genre) qui permet d'associer un jeu avec ses genres (ou un genre avec les jeux associés).
[Première problème résolu]Mon premier problème est que si j'envoie plusieurs genres à la fois pour un jeu, il y a une requête SQL de Doctrine qui m'empêche d'aller plus loin (Select Count* etc. en mettant une clause WHERE id_genre = ? (valeurs envoyées - ids genre).
Désireuse d'avancer, je n'envoie qu'un seul genre et bardaf, c'est l'embardée. Enfin, si on préfère, mon formulaire a un formulaire imbriqué concernant les genres. C'est une manière de récupérer l'id du nouveau insert mais voilà, dès qu'on arrive à l'insert dans la table JeuxHasGenre, j'ai donc cet id mais PAS l'id du genre sélectionné dans le formulaire. Pourtant, la fameuse requête SQL de mon premier problème récupère la donnée.
J'ai donc l'erreur suivante - je vous mets les logs avec les requêtes:
	Code:
	
| 12
 3
 4
 5
 
 |  
6	Info Doctrine_Connection_Statement	execute : SELECT COUNT(*) AS num_results FROM genre g WHERE g.id_genre = ? - (14)
7	Info Doctrine_Connection_Statement	execute : INSERT INTO jeux (developer, publisher, nom_jeu, background, release_date) VALUES (?, ?, ?, ?, ?) - (lb k, llbk, cjvj, bljhn,cghc, 2006-04-03)
8	Info Doctrine_Connection_Statement	execute : INSERT INTO jeux_has_genre (jeux_id_jeu) VALUES (?) - (29)
9	Error Doctrine_Connection_Mysql_Exception	SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`test_project`.`jeux_has_genre`, CONSTRAINT `jeux_has_genre_genre_id_genre_genre_id_genre` FOREIGN KEY (`genre_id_genre`) REFERENCES `genre` (`id_genre`)) | 
 Voici le schéma de ma base de donnée réalisée avec un modèle de mysql workbench:
	Code:
	
| 12
 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
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 
 | Genre:
  connection: doctrine
  tableName: genre
  columns:
    id_genre:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    nom_genre:
      type: string(50)
      fixed: true
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    JeuxHasGenre:
      local: id_genre
      foreign: genre_id_genre
      type: many
Jeux:
  connection: doctrine
  tableName: jeux
  columns:
    id_jeu:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    nom_jeu:
      type: string(255)
      fixed: true
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    developer:
      type: string(100)
      fixed: true
      unsigned: false
      primary: false
      default: Inconnu
      notnull: false
      autoincrement: false
    publisher:
      type: string(100)
      fixed: true
      unsigned: false
      primary: false
      default: Inconnu
      notnull: false
      autoincrement: false
    background:
      type: string()
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    release_date:
      type: date(25)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    is_on_steam:
      type: integer(1)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    JeuxHasGenre:
      local: id_jeu
      foreign: jeux_id_jeu
      type: many
    PlatformsHasJeux:
      local: id_jeu
      foreign: jeux_id_jeu
      type: many
JeuxHasGenre:
  connection: doctrine
  tableName: jeux_has_genre
  columns:
    jeux_id_jeu:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
    genre_id_genre:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
  relations:
    Genre:
      local: genre_id_genre
      foreign: id_genre
      type: one
    Jeux:
      local: jeux_id_jeu
      foreign: id_jeu
      type: one | 
 Voici ce qu'il y a dans JeuxForm (formulaire principal):
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | class JeuxForm extends BaseJeuxForm
{
  public function configure()
  {
    unset ($this['is_on_steam']);
 
    $game = new JeuxHasGenre();
 
    $game->Jeux = $this->getObject();
 
    $this->embedForm('genres',new JeuxHasGenreForm($game));
 
    $this->widgetSchema->setLabels(array(
      'nom_jeu'    => 'Game',
      'is_on_steam'=> 'Is on Steam?'
      ));
 
  } | 
 Voici le code dans JeuxHasGenreForm:
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | class JeuxHasGenreForm extends BaseJeuxHasGenreForm
{
  public function configure()
  {
      unset ($this['genre_id_genre']);
    $this->widgetSchema['genre'] = new sfWidgetFormDoctrineChoice (array('model'=> 'genre', 'choices'=> Doctrine_Core::getTable('genre'), 'multiple'=>true, 'expanded'=>true));
    $this->validatorSchema['genre'] = new sfValidatorDoctrineChoice (array('model'=>'genre'));
  }
} | 
 J'ai essayé plusieurs solutions style saveembeddedform() mais je n'arrive pas à bidouiller mon code convenablement. Si quelqu'un pouvait m'aider, même m'aiguiller, j'en serai reconnaissante.
Merci d'avance
Vic
EDIT: Etant donné que mon premier problème est résolu, je donne ici la solution. Mais le deuxième est toujours en train de me donner des maux de tête.
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | class JeuxHasGenreForm extends BaseJeuxHasGenreForm
{
  public function configure()
  {
    unset ($this['genre_id_genre']);
 
 
    $this->widgetSchema['genre'] = new sfWidgetFormDoctrineChoice (array('model'=> 'genre', 'choices'=> Doctrine_Core::getTable('genre'), 'multiple'=>true, 'expanded'=>true));
    $this->validatorSchema['genre'] = new sfValidatorDoctrineChoice (array('model'=>'genre', 'multiple' => true));//en fait, le validateur doit avoir aussi l'attribut multiple à true.
  }
} |