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:
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:
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:
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:
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:
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.
}
} |