Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/03/2011, 16h05   #1
Invité régulier
 
Inscription : septembre 2009
Messages : 22
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2009
Messages : 22
Points : 8
Points : 8
Par défaut Problème table de jointure backend

Bonjour,

Je suis confronté à un problème lié au backend (admin generator).
A priori, j'ai une relation 1-n de chaque côté de la table de jointure (AuteurHasBd).

Mon schema.yml ressemble à cela :
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
 
Auteur:
  connection: doctrine
  tableName: auteur
  actAs:
    Timestampable: ~
  columns:
    id_auteur:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    nom_auteur:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    AuteurHasBd:
      local: id_auteur
      foreign: id_auteur_fk
      type: many
AuteurHasBd:
  connection: doctrine
  tableName: auteur_has_bd
  actAs:
    Timestampable: ~
  columns:
    id_auteur_fk:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
    id_bd_fk:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
    id_serie_fk:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
  relations:
    Auteur:
      local: id_auteur_fk
      foreign: id_auteur
      type: one
    Bd:
      local: id_bd_fk
      foreign: id_bd
      type: one
    Bd_3:
      class: Bd
      local: id_serie_fk
      foreign: id_serie_fk
      type: one
Bd:
  connection: doctrine
  tableName: bd
  actAs:
    Timestampable: ~
  columns:
    id_bd:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    id_serie_fk:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      autoincrement: false
    libelle_bd:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    synopsis:
      type: string()
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    date_creation:
      type: date(25)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    miniature:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    nb_vues:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    nb_consultation_inactif:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    nb_cases_total:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    is_active:
      type: integer(1)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    Serie:
      local: id_serie_fk
      foreign: id_serie
      type: one
    AuteurHasBd:
      local: id_bd
      foreign: id_bd_fk
      type: many
    AuteurHasBd_3:
      class: AuteurHasBd
      local: id_serie_fk
      foreign: id_serie_fk
      type: many
    UtilisateurHasBd:
      local: id_bd
      foreign: id_bd_fk
      type: many
    UtilisateurHasBd_3:
      class: UtilisateurHasBd
      local: id_serie_fk
      foreign: id_serie_fk
      type: many
Dans le backend, je voudrais pouvoir, lorsque que je crée une BD lui attribuer un ou plusieurs auteurs (que je choisis parmi la liste des auteurs déjà présents ou que je crée).

Je me suis donc renseigné sur les formulaires imbriqués avec Symfony, mais je ne vois pas comment faire cela...

Auriez-vous une idée ?

Merci, d'avance.
Despecrew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 16h23   #2
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 769
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 769
Points : 788
Points : 788
Tu as donc une relation n-n entre Auteur et Bd. C'est cette relation n-n qu'il faut déclarer dans ton schema.yml plutôt que les deux relations 1-n de part et d'autre de la table d'association :

Doctrine : relations n-n en YAML

Dès lors, si tu déclares cela dans Auteur avec comme nom de relation Bds, tu pourras utiliser $form->embedRelation('Bds') dans ton formulaire Auteur (et récriproquement).
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 20h23   #3
Invité régulier
 
Inscription : septembre 2009
Messages : 22
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2009
Messages : 22
Points : 8
Points : 8
Merci d'avoir pris la peine de me répondre.

Néanmoins, je ne suis pas sur d'avoir bien compris. Cela donnerait quelque chose comme cela ?

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
111
112
113
114
115
116
117
118
119
120
121
122
Auteur:
  connection: doctrine
  tableName: auteur
  actAs:
    Timestampable: ~
  columns:
    id_auteur:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    nom_auteur:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    Bds:
      foreignAlias: Auteurs
      class: Bd
      refClass: AuteurHasBd
 
Bd:
  connection: doctrine
  tableName: bd
  actAs:
    Timestampable: ~
  columns:
    id_bd:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    id_serie_fk:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      autoincrement: false
    libelle_bd:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    synopsis:
      type: string()
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    date_creation:
      type: date(25)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    miniature:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    nb_vues:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    nb_consultation_inactif:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    is_active:
      type: integer(1)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
 
AuteurHasBd:
  connection: doctrine
  tableName: auteur_has_bd
  actAs:
    Timestampable: ~
  columns:
    id_auteur_fk:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
    id_bd_fk:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
    id_serie_fk:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
  relations:
    Bd:
      foreignAlias: AuteurHasBd
    Auteur:
      foreignAlias: AuteurHasBd
Despecrew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 09h48   #4
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 769
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 769
Points : 788
Points : 788
Ca ressemble à ça à quelques détails près. Le plus important est que ta table AuteurHasBd a 3 clés étrangères et non deux comme je le croyais. Je n'ai pas essayé d'utiliser les YAML de Doctrine dans le cas d'une table d'association à 3 clés donc... faut voir.

Cela dit, tel que je comprends ton schéma, cette table n'a pas besoin de 3 clés, non ? Un auteur a 1-n bds, une bédé a 1-n auteurs, chaque bd peut éventuellement faire partie d'une série. On aurait donc une relation n-n auteurs <-> bds et une relation 1-n bd <-> série.

Si c'est bien le cas, en corrigeant le schéma et en simplifiant le tout grâce aux convections Doctrine, ça donne quelque chose du type :
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
 
Auteur:
  actAs:
    Timestampable: ~
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    nom_auteur:
      type: string(45)
  relations:
    Bds:
      foreignAlias: Auteurs
      class: Bd
      refClass: AuteurHasBd
 
Bd:
  actAs:
    Timestampable: ~
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    serie_id:
      type: integer
    libelle_bd:
      type: string(45)
    synopsis:
      type: string()
    date_creation:
      type: date(25)
    miniature:
      type: string(45)
    nb_vues:
      type: integer(4)
    nb_consultation_inactif:
      type: integer(4)
    is_active:
      type: boolean
  relations:
    Serie:
      foreignAlias: Bds
 
Serie:
  actAs:
    Timestampable: ~
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
 
AuteurHasBd:
  actAs:
    Timestampable: ~
  columns:
    auteur_id:
      type: integer
      primary: true
    bd_id:
      type: integer
      primary: true
  relations:
    Bd:
      foreignAlias: AuteurHasBd
    Auteur:
      foreignAlias: AuteurHasBd
(!non testé!)

Les conventions utilisées pour alléger le fichier et faciliter la lecture sont :

columns:
- on utilise les valeurs par défaut implicites (autoincrement false, etc....)
- table avec une clé primaire unique : la colonne s'appelle 'id'
- table avec une clé étrangère vers la table MaTable : la colonne s'appelle 'ma_table_id'

relations: (relations directes telles que la relation Bd <-> Serie)
- nom de la relation = nom de la table visée
- par défaut, si la table visée s'appelle MaTable, la colonne qui sera utilisée par Doctrine sera la colonne ma_table_id

NB : par défaut, les fk sont en mode 'on delete: restrict' et 'on update: restrict'. Si tu veux utiliser des cascades, n'oublie pas de le signaler dans ton schéma.
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h10.


 
 
 
 
Partenaires

Hébergement Web