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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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 : 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
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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.
  }
}