IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[Doctrine] Relation n - n


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut [Doctrine] 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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    echo('<pre>'.$queryEntreprisesByCategorie->getSqlQuery().'</pre>');
    Me donne juste ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Membre émérite
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Points : 2 969
    Points
    2 969
    Par défaut
    Bonjour,

    Il me semble que la syntaxe du leftJoin est incorrecte.

    Essaie ceci (non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Le shema revu "a ma façon" (redéfinition des relations)
    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
    # 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 : 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
    // 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 !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    //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.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    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é !

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    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 : 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
     
    //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 !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    Pour le var_dump :
    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
    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 ?

    Je ne mettrais plus jamais jamais en rouge dans la nouvelle salle...
    Hum ?

  8. #8
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Tout est caché ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    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.

  10. #10
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    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 !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    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.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Doctrine] Relation complexe avec doctrine 1
    Par lowdance dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 08/11/2013, 20h22
  2. [Doctrine] Admin - Relations
    Par asmodaiii dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/03/2012, 15h05
  3. [Doctrine] Save sfForm Doctrine Relation 1-n
    Par Schlumpfe dans le forum ORM
    Réponses: 1
    Dernier message: 17/08/2011, 11h02
  4. Doctrine relation ternaire
    Par damiensan dans le forum ORM
    Réponses: 2
    Dernier message: 15/06/2010, 10h14
  5. [Doctrine] Relation multiple
    Par Matt59310 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/02/2010, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo