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:
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 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 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
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 le code dans JeuxHasGenreForm:
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?' )); }
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.
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')); } }
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. } }
Partager