Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > ORM > Doctrine
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 09/06/2011, 19h53   #1
Membre régulier
 
Inscription : août 2002
Messages : 165
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 165
Points : 84
Points : 84
Par défaut Relation n - n

Bonjour,
J'essai de réaliser une relation n-n sous doctrine mais rien ni fait. J'ai pourtant suivi pas mal de tuto, mais lorsque j'essai d'exploiter mes tables, pas de relation.

Je suis parti d'un fichier yaml pour générer ma table MySQL :

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
entreprise:
    actAs:
        SoftDelete:
        Timestampable:
            created:
                type: date
                format: d-m-Y
            update:
                type: date
                format: d-m-Y
        Sluggable:
            fields: [intitule]
        Searchable:
            fields: [intitule]
    columns:
        id:
            type: integer(8)
            primary: true
            autoincrement: true
        identifiant:
            type: string(100)
            notnull: true
        password:
            type: string(20)
            notnull: true
        intitule:
            type: string(255)
            notnull: true
    relations:
        RCategorie:
            class: categorie
            local: entreprise_id
            foreign: categorie_id
            refClass: entreprise_categorie
            foreignAlias: entreprises
 
categorie:
    columns:
        id:
            type: integer(4)
            primary: true
            autoincrement: true
        titre:
            type: string(100)
            notnull: true
    relations:
        REntreprise:
            class: entreprise
            local: categorie_id
            foreign: entreprise_id
            refClass: entreprise_categorie
            foreignAlias: categories
 
entreprise_categorie:
    columns:
        entreprise_id:
            type: integer(8)
            primary: true
        categorie_id:
            type: integer(4)
            primary: true
La base ce crée bien, et lorsque je regarde les relations de la table "entreprise_categorie" dans phpMyAdmin, tout est ok.

Ensuite dans mon code Php j'essai une requête de ce type (ressortir toutes les entreprises d'une catégorie) :

Code :
1
2
3
4
5
                    $categorie = $_GET['categorie'];
                    $queryEntreprisesByCategorie = Doctrine_Query::create()->select('e.intitule')
                                                                           ->from('entreprise e')
                                                                           ->leftJoin('entreprise_categorie ec')
                                                                           ->where('ec.categorie_id='.$categorie);
Mais un :
Code :
echo('<pre>'.$queryEntreprisesByCategorie->getSqlQuery().'</pre>');
Me donne juste ça :

Code :
SELECT e.id AS e__id, e.intitule AS e__intitule FROM entreprise e, entreprise_categorie e2 WHERE (e2.categorie_id = 1 AND (e.deleted_at IS NULL))
Il n'y a pas de JOIN dans le FROM... Faut-il laisser Doctrine gérer les ID peut-être ? Un idée ?

Merci de votre aide !
Alexandre` est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 22h41   #2
Modérateur
 
Avatar de Nesmontou
 
Homme Benjamin PREVOT
Architecte de système d'information
Inscription : septembre 2004
Messages : 1 568
Détails du profil
Informations personnelles :
Nom : Homme Benjamin PREVOT
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Architecte de système d'information
Secteur : Finance

Informations forums :
Inscription : septembre 2004
Messages : 1 568
Points : 2 493
Points : 2 493
Bonjour,

Il me semble que la syntaxe du leftJoin est incorrecte.

Essaie ceci (non testé)
Code :
1
2
3
Doctrine_Query::create()->select('e.intitule')
                        ->from('entreprise e')
                        ->where('e.RCategorie.id=' . $categorie);
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN

F.A.Q. : Java, PHP, (X)HTML / CSS

N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème
Nesmontou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 13h12   #3
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Le shema revu "a ma façon" (redéfinition des relations)
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
# sjema.yml (non testé)
entreprise:
    actAs:
        SoftDelete:
        Timestampable:
            created:
                type: date
                format: d-m-Y
            update:
                type: date
                format: d-m-Y
        Sluggable:
            fields: [intitule]
        Searchable:
            fields: [intitule]
    columns:
        identifiant:
            type: string(100)
            notnull: true
        password:
            type: string(20)
            notnull: true
        intitule:
            type: string(255)
            notnull: true
    relations:
        categories:
            class: categorie
            refClass: entreprise_categorie
            foreignAlias: entreprises
 
categorie:
    columns:
        titre:
            type: string(100)
            notnull: true
 
entreprise_categorie:
    columns:
        entreprise_id:
            type: integer
            primary: true
        categorie_id:
            type: integer
            primary: true
    relations:
        entreprise:
            foreignAlias: EntrepriseCategories
        categorie:
            foreignAlias: EntrepriseCategories
Ne jamais utiliser de $_GET et autre $_trucmuch dans du code symfony, toujours passer par un objet sfRequest qui est transmit à chaque action, généralement dans la variable $request. Le code revu :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// partie d'une action (non testé)
$categorie = $request->getParameters('categorie');
 
// Requête propre niveau conceptuel, mais trois tables chargées
$queryEntreprisesByCategorie = Doctrine_Query::create()
          ->from('categorie c')
          ->leftJoin('c.entreprises e')
          ->select('e.intitule')
          ->where('c.id= ?', $categorie);
 
// Requête allégée, mais on ne devrait jamais toucher directement à la table de liaison
$queryEntreprisesByCategorie = Doctrine_Query::create()
          ->from('entreprise_categorie ec')
          ->leftJoin('ec.entreprise e')
          ->select('e.intitule')
          ->where('ec.categorie_id= ?', $categorie);
Le résultat sera le même pour les deux requêtes. C'est plus une question de clarté du code et de performance qui fera pencher la balance. La deuxième version ne peut marcher que si le paramètre du where est l'id de la catégorie.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/06/2011, 18h04   #4
Membre régulier
 
Inscription : août 2002
Messages : 165
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 165
Points : 84
Points : 84
Merci pour vos réponses !

@Michel Rotta : Je ne travail pas avec Symfony, j'utilise uniquement Doctrine en fait.

J'ai modifier mon fichier YAML avec ta variante et la requête générée est bonne :
Code :
SELECT e.intitule AS e__0 FROM categorie c LEFT JOIN entreprise_categorie e2 ON (c.id = e2.categorie_id) LEFT JOIN entreprise e ON e.id = e2.entreprise_id AND (e.deleted_at IS NULL) WHERE (c.id = 1)
Si je lance cette requête sous MySQL, le résultat est bon, 9 lignes sont ressorties.

Par contre en code, je n'arrive à récupérer qu'une seule ligne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//affichage des entreprises de la carégorie
$categorie = $_GET['categorie'];
$queryEntreprisesByCategorie = Doctrine_Query::create()
    ->from('categorie c')
    ->leftJoin('c.entreprises e')
    ->select('e.intitule AS intitule')
    ->where('c.id= 1');//', $categorie);
 
//requête utilisé pour test dans MySQL                                                    
echo('<pre>'.$queryEntreprisesByCategorie->getSqlQuery().'</pre>');
 
$entreprises = $queryEntreprisesByCategorie->execute();
 
foreach ($entreprises as $entreprise) {
    echo('- '.$entreprise['intitule'].'<br />');
}
En utilisant la méthode fetchArray(), même résultat.
Alexandre` est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2011, 18h26   #5
Membre régulier
 
Inscription : août 2002
Messages : 165
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 165
Points : 84
Points : 84
Hum d'ailleurs je viens de me rendre compte que je ne poste pas dans le bon sous-forum. Si vous voulez déplacer le post, désolé !
Alexandre` est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2011, 19h14   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Je déplace. Je ne mettrais plus jamais jamais en rouge dans la nouvelle salle...

Je ne vois pas trop d'où le problème pourrait venir.

le fechtArray() lance simplement un execute() avec un paramètre qui demande un array en retour.

Que donne un var_dump() du tableau récupéré ?

Je pense que ton code devrait plutôt être :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
//affichage des entreprises de la carégorie
$categorie = $_GET['categorie'];
$queryEntreprisesByCategorie = Doctrine_Query::create()
    ->from('categorie c')
    ->leftJoin('c.entreprises e')
    ->select('e.intitule AS intitule')
    ->where('c.id= 1');//', $categorie); // !!!
 
//requête utilisé pour test dans MySQL                                                    
echo('<pre>'.$queryEntreprisesByCategorie->getSqlQuery().'</pre>');
 
$categorie= $queryEntreprisesByCategorie->execute();
 
foreach ($categorie->getEntreprises() as $entreprise) {
    echo('- '.$entreprise['intitule'].'<br />');
}
Regarde symfony pour ta prochaine application, avec doctrine tu as déjà franchi 50% du chemin vers "el bel codo" !
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2011, 19h21   #7
Membre régulier
 
Inscription : août 2002
Messages : 165
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 165
Points : 84
Points : 84
Pour le var_dump :
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
object(Doctrine_Collection)[60]
  protected 'data' => 
    array
      0 => 
        object(categorie)[62]
          protected '_node' => null
          protected '_id' => 
            array
              ...
          protected '_data' => 
            array
              ...
          protected '_values' => 
            array
              ...
          protected '_state' => int 5
          protected '_lastModified' => 
            array
              ...
          protected '_modified' => 
            array
              ...
          protected '_oldValues' => 
            array
              ...
          protected '_errorStack' => null
          protected '_references' => 
            array
              ...
          protected '_pendingDeletes' => 
            array
              ...
          protected '_pendingUnlinks' => 
            array
              ...
          protected '_serializeReferences' => boolean false
          protected '_invokedSaveHooks' => boolean false
          private '_oid' (Doctrine_Record) => int 8
          protected '_table' => 
            object(Doctrine_Table)[9]
              ...
          protected '_locator' => null
          protected '_resources' => 
            array
              ...
  protected '_table' => 
    object(Doctrine_Table)[9]
      protected '_data' => 
        array
          empty
      protected '_identifier' => string 'id' (length=2)
      protected '_identifierType' => int 1
      protected '_conn' => 
        object(Doctrine_Connection_Mysql)[5]
          protected 'driverName' => string 'Mysql' (length=5)
          protected 'dbh' => 
            object(PDO)[18]
              ...
          protected 'tables' => 
            array
              ...
          protected '_name' => int 0
          protected 'isConnected' => boolean true
          protected 'supported' => 
            array
              ...
          protected 'pendingAttributes' => 
            array
              ...
          private 'modules' (Doctrine_Connection) => 
            array
              ...
          protected 'properties' => 
            array
              ...
          protected 'serverInfo' => 
            array
              ...
          protected 'options' => 
            array
              ...
          protected '_count' => int 2
          protected '_usedNames' => 
            array
              ...
          protected 'attributes' => 
            array
              ...
          protected 'parent' => 
            object(Doctrine_Manager)[1]
              ...
          protected '_impl' => 
            array
              ...
          protected '_params' => 
            array
              ...
          protected '_locator' => null
          protected '_resources' => 
            array
              ...
      protected '_identityMap' => 
        array
          1 => 
            object(categorie)[22]
              ...
          2 => 
            object(categorie)[23]
              ...
          3 => 
            object(categorie)[24]
              ...
          4 => 
            object(categorie)[25]
              ...
      protected '_repository' => 
        object(Doctrine_Table_Repository)[12]
          private 'table' => 
            &object(Doctrine_Table)[9]
          private 'registry' => 
            array
              ...
      protected '_columns' => 
        array
          'id' => 
            array
              ...
          'titre' => 
            array
              ...
      protected '_uniques' => 
        array
          empty
      protected '_fieldNames' => 
        array
          'id' => string 'id' (length=2)
          'titre' => string 'titre' (length=5)
      protected '_columnNames' => 
        array
          'id' => string 'id' (length=2)
          'titre' => string 'titre' (length=5)
      protected 'columnCount' => int 2
      protected 'hasDefaultValues' => null
      protected '_options' => 
        array
          'name' => string 'categorie' (length=9)
          'tableName' => string 'categorie' (length=9)
          'sequenceName' => null
          'inheritanceMap' => 
            array
              ...
          'enumMap' => 
            array
              ...
          'type' => null
          'charset' => null
          'collate' => null
          'treeImpl' => null
          'treeOptions' => 
            array
              ...
          'indexes' => 
            array
              ...
          'parents' => 
            array
              ...
          'joinedParents' => 
            array
              ...
          'queryParts' => 
            array
              ...
          'versioning' => null
          'subclasses' => 
            array
              ...
          'orderBy' => null
          'declaringClass' => 
            object(ReflectionClass)[11]
              ...
      protected '_tree' => null
      protected '_parser' => 
        object(Doctrine_Relation_Parser)[6]
          protected '_table' => 
            &object(Doctrine_Table)[9]
          protected '_relations' => 
            array
              ...
          protected '_pending' => 
            array
              ...
      protected '_templates' => 
        array
          empty
      protected '_filters' => 
        array
          0 => 
            object(Doctrine_Record_Filter_Standard)[10]
              ...
      protected '_generators' => 
        array
          empty
      protected '_generator' => null
      protected '_invokedMethods' => 
        array
          empty
      protected 'record' => 
        object(categorie)[7]
          protected '_node' => null
          protected '_id' => 
            array
              ...
          protected '_data' => 
            array
              ...
          protected '_values' => 
            array
              ...
          protected '_state' => int 3
          protected '_lastModified' => 
            array
              ...
          protected '_modified' => 
            array
              ...
          protected '_oldValues' => 
            array
              ...
          protected '_errorStack' => null
          protected '_references' => 
            array
              ...
          protected '_pendingDeletes' => 
            array
              ...
          protected '_pendingUnlinks' => 
            array
              ...
          protected '_serializeReferences' => boolean false
          protected '_invokedSaveHooks' => boolean false
          private '_oid' (Doctrine_Record) => int 1
          protected '_table' => 
            &object(Doctrine_Table)[9]
          protected '_locator' => null
          protected '_resources' => 
            array
              ...
      protected 'attributes' => 
        array
          empty
      protected 'parent' => 
        object(Doctrine_Connection_Mysql)[5]
          protected 'driverName' => string 'Mysql' (length=5)
          protected 'dbh' => 
            object(PDO)[18]
              ...
          protected 'tables' => 
            array
              ...
          protected '_name' => int 0
          protected 'isConnected' => boolean true
          protected 'supported' => 
            array
              ...
          protected 'pendingAttributes' => 
            array
              ...
          private 'modules' (Doctrine_Connection) => 
            array
              ...
          protected 'properties' => 
            array
              ...
          protected 'serverInfo' => 
            array
              ...
          protected 'options' => 
            array
              ...
          protected '_count' => int 2
          protected '_usedNames' => 
            array
              ...
          protected 'attributes' => 
            array
              ...
          protected 'parent' => 
            object(Doctrine_Manager)[1]
              ...
          protected '_impl' => 
            array
              ...
          protected '_params' => 
            array
              ...
          protected '_locator' => null
          protected '_resources' => 
            array
              ...
      protected '_impl' => 
        array
          empty
      protected '_params' => 
        array
          empty
      protected '_locator' => null
      protected '_resources' => 
        array
          empty
  protected '_snapshot' => 
    array
      0 => 
        object(categorie)[62]
          protected '_node' => null
          protected '_id' => 
            array
              ...
          protected '_data' => 
            array
              ...
          protected '_values' => 
            array
              ...
          protected '_state' => int 5
          protected '_lastModified' => 
            array
              ...
          protected '_modified' => 
            array
              ...
          protected '_oldValues' => 
            array
              ...
          protected '_errorStack' => null
          protected '_references' => 
            array
              ...
          protected '_pendingDeletes' => 
            array
              ...
          protected '_pendingUnlinks' => 
            array
              ...
          protected '_serializeReferences' => boolean false
          protected '_invokedSaveHooks' => boolean false
          private '_oid' (Doctrine_Record) => int 8
          protected '_table' => 
            object(Doctrine_Table)[9]
              ...
          protected '_locator' => null
          protected '_resources' => 
            array
              ...
  protected 'reference' => null
  protected 'referenceField' => null
  protected 'relation' => null
  protected 'keyColumn' => null
  protected '_locator' => null
  protected '_resources' => 
    array
      empty
Hum je n'ai pas très bien compris ton code par contre. Je découvre seulement depuis quelques jours Doctrine, mais d'où sort getEntreprises() ? Et tu utilises de nouveau ma var contenant l'id de la catégorie ?

Citation:
Je ne mettrais plus jamais jamais en rouge dans la nouvelle salle...
Hum ?
Alexandre` est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2011, 20h11   #8
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Tout est caché ici :
Code :
1
2
3
          protected '_table' => 
            object(Doctrine_Table)[9]
              ...
En fait dans doctrine tu gères des objets et des collections d'objets. Accessoirement, j'ai été un peu vite dans mon code et il ne peut pas fonctionner.

Je m'explique. "execute()" retourne par défaut une collection (Doctrine_Collection) d'enregistrement (Doctrine_Record). Dans ton cas tu as donc une collection d'un record. Vu que tu as une relation tu as donc soit des enregistrement, soit, ici, des collections. Dans le shema tu définis une relations n-n entre tes deux tables. le getter getEntreprises() permet de récupérer la Doctrine_Collection des Doctrine_Record qui correspondent aux 9 objets récupérés dans la table liée.

Vu que ton code ne peut retourner qu'une catégorie, il est plus simple de récupérer directement le Doctrine_Record qui correspond, il faut donc modifier le execute par
Code :
$categorie= $queryEntreprisesByCategorie->fechtOne();
qui va récupérer le premier enregistrement de la Doctrine_Collection, en l'occurrence vu qu'il n'y en a qu'un, on aura donc notre enregistrement.

La convention veut que les variables et les getter qui contiennent/retourne des collections portent un "s" ou un "x" à la fin.

A noter que tu pourrais très bien te passer de faire une requête compliquée, en effet, le code suivant marchera aussi :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//affichage des entreprises de la carégorie
$categorie = $_GET['categorie'];
$queryEntreprisesByCategorie = Doctrine_Query::create()
    ->from('categorie c')
    ->where('c.id= 1');//', $categorie); // !!!
 
//requête utilisé pour test dans MySQL                                                    
echo('<pre>'.$queryEntreprisesByCategorie->getSqlQuery().'</pre>');
 
$categorie= $queryEntreprisesByCategorie->fechtOne();
 
foreach ($categorie->getEntreprises() as $entreprise) {
    echo('- '.$entreprise['intitule'].'<br />');
}
Lorsque le Doctrine_Record $categorie (vu que j'y ai mis un fechtOne() ) va se retrouver devant le getter sur la relation "entreprises" il va générer et exécuter la requête qui lui permettra d’alimenter les 9 objets enfants de cette collection. Le seul inconvénient est la multiplication des requêtes. C'est pourquoi il est plus intéressant de prévoir la requête avec toutes les données au préalable.

A noter aussi qu'il peut être plus intéressant d'hydrater les données, regarde dans la documentation doctrine, l'espace mémoire et la rapidité d'exécution sont largement augmenter, du moins en ce qui concerne l'affichage, s'il y a modification, il faut conserver le modèle objet.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 17h45   #9
Membre régulier
 
Inscription : août 2002
Messages : 165
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 165
Points : 84
Points : 84
Merci pour ton aide, j'ai finalement opter pour la 2eme solution et tout fonctionne. Je commence à y voir un peu plus clair.

Je me permet de poser une autre question lié à Doctrine (seul). C'est plus niveau architecture, mais je voulais pas créer un nouveau post juste pour ça. Toutes les recherches me parle du couple Symfony/Doctrine.

J'ai un formulaire affichant les informations de mon client. Je peux modifier ses informations et valider pour enregistrer les nouvelles données en base de données.

Actuellement, au chargement de mon formulaire, je récupère mon objet client avec un getTable('Client')->findOneById($id), et j'affiche les infos avec des echo dans mes fields de mon form.

Maintenant je me pose la question sur l'enregistrement. En php simple, ça nous demande de rafraichir/changer de page. Mais comment mettre à jour mon client proprement ? J'ai deux idées :

* Garder en session un objet Client. Celui-ci sera affiché lorsqu'on affiche le formulaire. Puis lors de la validation, je rempli l'objet avec les nouvelles données du formulaire et je fais un save().

Dans ce cas, j'ai peur de pas toujours être synchronisé entre mon objet en session et les valeurs en BD (connexion sur un autre pc, etc).

* Sinon, le faire un peu bourrin : récupération de mon client pour affichage des données. Et récupération de nouveau de mon client pour mettre à jour ses infos + un save().

Symfony semble simplifier le concept, mais je ne peux pas partir dessus sur ce petit projet.

Merci de ton aide en tout cas.
Alexandre` est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 10h21   #10
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Je ne comprend pas trop pourquoi tu n'utilises pas les form de symfony pour ce qui est génération et, surtout, validation des formulaires.

Pour le numéro d'enregistrement, en général je le passe dans l'url. Par contre il est sur que, pour le détail de l'utilisateur ce n'est pas l'idéal. Après, tout dépend de ta gestion d'utilisateur, si tu utilises sfGuard, tu peux récupérer l'objet du user avec un getUserObject() (a vérifier nom de la méthode) depuis ton ton objet user. Tu as alors un sfRecord qui peut être utilisé comme un objet récupéré par un findOneByTruc...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 11h12   #11
Membre régulier
 
Inscription : août 2002
Messages : 165
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 165
Points : 84
Points : 84
Salut,
Merci pour tes conseils. Du coup j'ai remonté mon projet sous Symfony.

Pour l'instant, j'ai créé mon module entreprise et généré tout ce qui est liste et formulaire. Tout fonctionne bien sans trop d'efforts.

Mon problème vient toujours de ma relation n-n. Dans le form généré j'ai bien la possibilité d'affecter mon entreprise à plusieurs catégories via une listbox (à choix multiple).

Mais maintenant je voudrais afficher ses catégories dans son détail. Et c'est là ma question :
Est-ce que je dois ajouter une fonction executeCategories() dans mon actions.class.php et affecter mes catégories à une var : $this->categories et ensuite utiliser la var $categories dans mon templates ? comme expliquer ici : http://www.symfony-project.org/jobee...Doctrine/fr/04

J'ai essayé, mais ma var $categories n'existe pas. Faut-il appeler executeCategories() à un moment donné ? Il ne le précise pas dans le tuto. Mais j'imagine que c'est nécessaire.

Merci de ton aide.
Alexandre` est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 14h23   #12
Membre régulier
 
Inscription : août 2002
Messages : 165
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 165
Points : 84
Points : 84
Bon je commence à piger le fonctionnement.
J'ai ajouté mes infos tests supplémentaires dans la fonction executeShow avec un $this->varTest = "..."; et j'arrive a la récupérer coté template avec un $varTest.

Il ne me reste plus qu'à récupérer les catégories et les renvoyer de la même façon.

Je ferme la discussion pour le coup. Merci de votre aide !
Alexandre` est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h04.


 
 
 
 
Partenaires

Hébergement Web