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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 Expert
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    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);

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    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.

  4. #4
    Membre confirmé
    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
    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 confirmé
    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
    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 confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    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" !

+ 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