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 Select Count fonctionne pas


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 33
    Par défaut
    Bonjour,

    J'ai besoin d'aide pour effectuer une requête de type Select COUNT avec le query builder.

    J'ai une table/entité Hotel et une table/entité Chambre

    Pour récupérer et compter le nombre de chambres pour chaque hôtel, je fais la requête suivante en sql classique :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select h.*, count(c.id)
    from hotel h
    join chambre c
    on c.hotel_id=h.id
    where h.ville_id=ville_id
    group by h.id

    ça marche niquel !

    Mais sous symfony, pour faire la même chose avec le querybuilder, c'est un vrai calvaire :

    Dans le repository Hotel, je mets le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $qb= $this->createQueryBuilder('h');
     
    		        $qb->addSelect('COUNT(c.id)')
                            ->join('h.chambres','c')
                            ->where('h.ville = :ville')
                            ->groupBy('c.hotel')
    			->setParameter('ville',$ville)
                            ->getQuery()->getResult();
    Et lorsque dans mes vues j'essaie d'afficher les informations de chaque hotel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{hotel.nom }}, {{hotel.classment }}
    je reçois l'exception suivante :

    Key "nom" for array with keys "0, 1" does not exist in EuropeVoyageBundle::listeHotels.html.twig at line 9
    J'aurais grand besoin d'aide pour identifier et régler mon problème

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    Lorsque les résultats d'une requete DQL comportent à la fois un objet et d'autres valeurs , chaque ligne est un tableau avec à l'index 0 l'objet.

    http://docs.doctrine-project.org/en/...-mixed-results

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {%for result in results%}
         {%set hotel = result[0]%}
         {%set countChambres = result[1]%}
        {{hotel.nom }}, {{hotel.classment }}, {{countChambres}}
    {%endfor%}

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 33
    Par défaut
    merci,

    Effectivement, j'avais remarqué en faisant un var_dump($results) que j'avais un tableau avec 0->mes entités, 1->mes count, mais je ne savais pas comment me sortir de ça

    Cela fonctionne bien lorsque je les réaffiche avec twig {% set h= result[0] %}

    Mais est-ce quand-même propre comme méthode ?

  4. #4
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Hello,

    Ce n'est pas "propre" dans la mesure ou ça peut être évité, mais ce n'est pas non plus un crime de lèse-majesté.

    Dans ton cas tu pourrais faire un addSelect('c') pour remplacer le count. Tu charges un peu plus ton graphe d'objet, mais tu vas bien récupérer des objets et plus des tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $qb= $this->createQueryBuilder('h');
    $qb->addSelect('c')
        ->join('h.chambres','c')
        ->where('h.ville = :ville')
        ->groupBy('c.hotel')
        ->setParameter('ville',$ville)
        ->getQuery()->getResult();
    Ca te permettrait d'avoir dans ton twig quelque chose d'un peu plus élégant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {%for hotel in results%}
        {{hotel.nom }}, {{hotel.classment }}, {{ hotel.chambres|length }}
    {%endfor%}
    Et puis ça évite de faire appel au lazy loading si jamais tu utilises des propriétés de chambres.

    Si vraiment la jointure est trop énorme et renvoie inutilement une quantité astronomique d'objets dans la collection, alors personnellement je préfère faire une autre requête pour le count, dans une variable à part, ou je retourne les différents counts, indexés par l'id de l'entité principale. C'est pas forcément plus élégant, mais ma collection reste une collection d'objets propre.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 33
    Par défaut
    Merci pour vos indications

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 33
    Par défaut
    Petit problème cela dit :

    Lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $qb= $this->createQueryBuilder('h');
    $qb->addSelect('c')
        ->join('h.chambres','c')
        ->where('h.ville = :ville')
        ->groupBy('c.hotel')
        ->setParameter('ville',$ville)
        ->getQuery()->getResult();
    Lorsque dans ma vue j'essaie d'afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {{ h.chambres.count }} chambres libres
    ou meme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {{ h.chambres | length }} chambres libres
    Cela m'affiche toujours "1 chambres libres" et non pas le nombre de chambres souhaitées, c'est à dire que le count ne s'effectue pas.

    Comment pourrais-je régler cela ?

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/04/2011, 12h47
  2. Réponses: 4
    Dernier message: 06/11/2007, 09h58
  3. [Interbase] select ne fonctionne pas
    Par xclam dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/04/2007, 18h01
  4. Réponses: 7
    Dernier message: 10/01/2006, 10h27
  5. mon select count(*) marche pas
    Par zorba49 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 05/08/2005, 08h28

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