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

Symfony PHP Discussion :

Doctrine - Query builder - Ne pas sélectionner toutes les colonnes dans un left-join [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Par défaut Doctrine - Query builder - Ne pas sélectionner toutes les colonnes dans un left-join
    Bonjour

    J'ai deux entités :

    NOTE : id, title, description, isPublic, user
    USER: id, email, firstname, lastname, password, salt, roles, tag

    Je voudrais sélectionner seulement quelques colonnes de l'entité User lorsque je veux récupérer l'ensemble des entités Note dans ma base de données, tout en faisant une jointure afin d'avoir le propriétaire de la note. (Je ne veux pas toutes les colonnes de l'utilisateur car, je voudrais ne pas récupérer son mot de passe par exemple).

    Donc dans le NoteRepository, j'ai créé une requête comme celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $qb = $this->createQueryBuilder('n');
    //Get the owner of the knowledge
    $qb
        ->leftJoin('n.user', 'owner')
        ->addSelect('owner.tag as ownerTag, owner.firstname as ownerFirstname, owner.lastname as ownerLastname')
    ;
     
    return $qb->getQuery()->getResult(Query::HYDRATE_ARRAY);
    (J'insiste bien sur le fait que je veux utiliser une clause left-join car on peut imaginer que plusieurs personnes soit propriétaire d'une note)

    Avec la requête précédente j'obtient quelque comme :

    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
    [
       {
          "0":{
             "id":6,
             "title":"A1",
             "description":"A1",
             "isPublic":false,
             "ownerTag":"#02a4c022d8",
             "ownerFirstname":"ama",
             "ownerLastname":"ama"
          }
       },
       {
          "1":{
             "id":7,
             "title":"Z1",
             "description":"Z1",
             "isPublic":false,
             "ownerTag":"#00a7bd24g8",
             "ownerFirstname":"z",
             "ownerLastname":"z"
          }
       }
    ]
    En revanche je voudrais une réponse dans le genre :

    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
    [
       {
          "0":{
             "id":6,
             "title":"A1",
             "description":"A1",
             "isPublic":false,
             "owner":{
                "tag":"#02a4c022d8",
                "firstname":"ama",
                "lastname":"ama"
             }
          }
       },
       {
          "1":{
             "id":7,
             "title":"Z1",
             "description":"Z1",
             "isPublic":false,
             "owner":{
                "tag":"#00a7bd24g8",
                "firstname":"z",
                "lastname":"z"
             }
          }
       }
    ]
    Je ne comprends pas trop comment faire, car dès que j'utilise le addSelect pour signifier les colonnes que je veux garder, Doctrine à l'air de me retourner uniquement les colonnes de la dernière entité du left-join ...

    Merci d'avance pour vos réponses !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Par défaut
    Re-bonjour !

    J'ai trouvé la solution. Il faut que la requête ai cette forme la avec l'utilisation d'une clause PARTIAL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $qb = $this->createQueryBuilder('n');
    //Get the owner of the knowledge
    $qb
        ->leftJoin('n.user', 'owner')
        ->addSelect('PARTIAL owner.{id,tag,firstname,lastname}')
    ;
     
    return $qb->getQuery()->getResult(Query::HYDRATE_ARRAY);
    Voilà c'est la si quelqu'un d'autre à le même problème que moi !

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Bonsoir, juste une remarque SQL (pas Doctrine).

    (J'insiste bien sur le fait que je veux utiliser une clause left-join car on peut imaginer que plusieurs personnes soit propriétaire d'une note)
    Ce n'est pas du tout ce que fait ton leftJoin. Ton leftJoin signifie même si un owner n'a pas de notes dans ma liste de notes, fais le remonter avec des notes nulles.
    Donc je crois qu'en l'occurrence, innerJoin sera parfait. Car j'imagine que toutes tes notes ont un propriétaire qui existe dans ta table propriétaire ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from note 
    inner join owner on blablabla
    /*fait remonter toutes les notes qui ont bien un owner dans la table owner*/
     
    from note 
    left join owner on blablabla
    /*fait remonter toutes les notes et au moins une ligne pour chaque owner, même s'il n'a pas émis de note*/
     
    from owner
    left join note on blablabla
    /*fait remonter tous les owners et au moins une ligne pour chaque note, même si elle n'avait pas d'owner */
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

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

Discussions similaires

  1. Sélectionner toutes les colonnes sauf une.
    Par pedro99 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 23/05/2009, 17h21
  2. [Criteria] ne pas prendre toutes les colonnes dans un Join
    Par Sniper37 dans le forum Hibernate
    Réponses: 2
    Dernier message: 30/03/2009, 18h30
  3. Réponses: 5
    Dernier message: 22/03/2009, 23h22
  4. pourquoi ne pas inclure tout les cpp dans un projet
    Par ReaderDigest dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/01/2008, 17h48
  5. Jtable : ne pas afficher toute les colonnes
    Par ericT dans le forum Composants
    Réponses: 3
    Dernier message: 02/08/2006, 11h54

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