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 :

QueryBuilder - Retourner toutes les lignes sans les regrouper par collection


Sujet :

Symfony PHP

  1. #1
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut QueryBuilder - Retourner toutes les lignes sans les regrouper par collection
    Bonjour à tous,

    J'ai une relation ManyToMany entre une classe Gens et Bagnole.
    Je suis aujourd'hui capable de retourner des lignes de Gens, ayant chacun une collection de Bagnole, et inversement.
    Ce que je souhaite est un peu particulier : je souhaite en utilisant le QueryBuilder retourner autant de lignes que de combinaisons Gens-Bagnole.

    Exemple :
    Albert possède une Fiat, et une Volvo. Bruno possède une Fiat, et une Opel.
    Aujourd'hui, la logique veut que si je fais un findAll sur ma classe Gens je me retrouve avec 2 résultats :

    Albert possède une collection de voitures (Fiat, Volvo)
    Bruno possède une collection de voitures (Fiat, Opel).

    Ce que je veux maintenant c'est tout le contraire de ce que je passe mon temps à dire à tout le monde : "ne plus (vraiment) penser objet".
    Je veux que mon QueryBuilder me retourne quelque chose qui va à l'encontre de ça c'est à dire 4 résultats (et non 2) :

    Albert possède une Fiat
    Albert possède une Volvo
    Bruno possède une Fiat
    Bruno possède une Opel


    En réalité, si c'est possible, pour que ça matche avec avec ma classe, je présume qu'il s'agira en fait à chaque fois d'une collection de une seule bagnole, mais ça me va.

    Je précise un dernier point, ce résultat doit m'être retourné par un QueryBuilder et non trafiqué à la mano après un résultat normal.

    Est-ce que Doctrine permet ça d'une manière ou d'une autre (ou existe-t-il un moyen futé de tricher via des groupBy, des distinct ... j'ai fais quelques tentatives sans succès) ? Je n'y crois guère mais je jète quand même une bouteille à la mer.

    Merci ! ++

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    De mémoire je crois que c'est un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $qb = $this->createQueryBuilder('e');
    $qb
        ->select('people.name', 'car.name');
        /* [...]  */
     
    return $qb->getQuery()->getArrayResult();
    Faut que je retrouve le projet ou j'ai une requête comme ca qui traine ^^

  3. #3
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Mmmh plusieurs entités dans le SELECT : j'avais eu l'idée mais pour moi ça peuple le graphe d'objet en évitant le lazy-loading mais ça ne réponds pas à cette problématique la.

    Éventuellement c'est plusieurs FROM, qu'il me faudrait. Mais comme je n'ai pas d'entité pour ma table intermédiaire (parce qu'au final concrètement c'est ça que je veux faire : lister les éléments de ma table intermédiaire), et que je ne compte pas diviser ça en ManyToOne + OneToMany, je me retrouve un peu le bec dans l'eau puisque je n'ai pas de rootEntity pour mon QueryBuilder.

    Parce que gototog, 'e' c'est l'alias de quoi dans ton exemple ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Pas besoin de faire de from, il suffit d'utiliser une jointure. Ducoup tu pars d'un des deux cotés pour le builder.
    Ducoup si je rendais mon exemple un peu plus adapté ca donnerait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $qb = $this->createQueryBuilder('people');
    $qb
        ->select('people.name', 'car.name')
        ->innerJoin('people.cars', 'car');
     
     
    return $qb->getQuery()->getArrayResult();
    A noter que c'est très important d'utiliser ->select() plutot que ->addSelect() car creaqteQueryBuilder effectue de base un select qu'il faut remplacer.

    Je déteste les manyToMany :]

  5. #5
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Mmmh, c'eut été une bonne idée si je n'avais pas eu besoin d'avoir des objets. Mais comme je m'en doutais, la logique veut que l'ORM fasse son boulot et me colle ça dans les collections.

    Cela dit, à peu de chose près le ArrayResult aurait pu faire l'affaire c'était une bonne idée.

    Je vais revoir la logique de mon fonctionnement.

    Merci cela dit

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/10/2010, 19h05
  2. Réponses: 4
    Dernier message: 05/09/2008, 11h03
  3. Compter le nombre de lignes sans les doublons
    Par byrdo dans le forum Excel
    Réponses: 15
    Dernier message: 15/06/2007, 14h30
  4. Faire apparaitre les lignes sans enregistrements.
    Par bolderiz dans le forum Designer
    Réponses: 8
    Dernier message: 22/05/2007, 13h44

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