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

Doctrine2 PHP Discussion :

[Query Builder] Compter le nombre d'entrées d'une relation


Sujet :

Doctrine2 PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 2
    Points
    2
    Par défaut [Query Builder] Compter le nombre d'entrées d'une relation
    Bonjour à tous,

    Une petite question de syntaxe à propos du QueryBuilder.
    J'ai une entité Classe qui a une relation students pour avoir les élèves appartenant à cette classe.

    J'aimerais avoir le nombre d'élèves par classe à la requête de ma liste, seulement si j'ajoutes un ->count j'ai une erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Repository
    $query = $this->createQueryBuilder('c')
    ->orderBy('c.title')
    //->count('c.students')
    ->getQuery();
     
    return $query->getResult();
    Je ne vois pas trop comment mettre mon count en DQL.

    Merci pour votre aide.

  2. #2
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Salut,

    Voila ce que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public function countByAccount(Account $account)
        {
            $qb = $this->createQueryBuilder('e');
     
            $qb ->select($qb->expr()->count('e'))
                ->where('e.account = :account')
                    ->setParameter('account', $account);
     
            return (int) $qb->getQuery()->getSingleScalarResult();
        }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    A mon avis j'ai du mal me faire comprendre, en fait je voulais afficher le nombre d'étudiants par classe sur la page qui liste toutes les classes.

    J'y arrivais en ajoutant une fonction dans mon entité classe qui retournait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->getStudents()->count();
    Mais ca me faisait une requete en plus par classe.

    Pour palier au problème, j'ai du rajouter un leftJoin dans le repository et faire le count dans le template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Repository
     
    $query = $this->createQueryBuilder('c')
    ->addSelect('s')
    ->leftJoin('c.students', 's')
    ->orderBy('c.title')
    ->getQuery();
     
    return $query->getResult();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Template
    {{ entity.students.count }}
    Merci encore

  4. #4
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Tu te sers de la liste des étudiants ou tu veux juste leur nombre ?

    Si tu veux juste leur nombre, modifie ta requete en utilisant mon count. Parce que là tu sélectionnes vraiment tout, c'est pas optimisé du tout !

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Je veux juste le nombre d'étudiants par classe sur la page qui liste toutes les classes.

    Si je regarde ta requete, c'est pour une seule classe ?

    Et je ne vois pas trop comment ajouter cela à ma requete initiale qui liste les classes

  6. #6
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $qb = $this->createQueryBuilder('c');
    $query->addSelect($qb->expr()->count('s'))
      ->leftJoin('c.students', 's')
      ->groupBy('c.id')
      ->orderBy('c.title')
      ->getQuery();
    J'ai pas testé mais ca m'intéresse de savoir comment tu t'en sors avec ca, car du coup tu récupères pas un objet Classe...

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    En effet.

    Il ne me retourne 1 array qui en comprend 2: 1 pour les infos classes et 1 avec le count.

    Seulement il ne me retourne que les classes qui contiennent des élèves.

  8. #8
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Ah pas mal le retour.

    Pour le fait qu'il ne prenne que les classes avec des élèves, essaie un count('c') plutot que 's'. J'ai pas trouvé comment mettre '*' en fait.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Alors le retour donne le nombre de classes, et toujours une seule classe d'affichée dans l'array.

    Par contre j'ai trouvé que ceci fonctionne aussi et donne le même résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $qb = $this->createQueryBuilder('c');
    $query->addSelect('COUNT(s)')
      ->leftJoin('c.students', 's')
      ->orderBy('c.title')
      ->getQuery();

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Bon alors ceci fonctionne, mais je dois rajouter des 0 et 1 dans mes template, ce qui n'est pas encore le but :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $qb = $this->createQueryBuilder('c');
    $query->addSelect('COUNT(s)')
      ->leftJoin('c.students', 's')
      ->orderBy('c.title')
      ->groupBy('c.id')
      ->getQuery();

  11. #11
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    COUNT(c) ca marche pas ?
    J'ai pas compris tes 0 et 1 dans les templates ?

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    non COUNT(c) ne fonctionne pas.

    Pour les 0 et les 1 en fait cela me donne qqch du 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Array
    (
        [0] => Array
            (
                [0] => Array
                    (
                        [id] => 8
                        [title] => 1 KMS
                        [school] => Array
                            (
                                [id] => 1
                                [title] => KMS
                                [fulltitle] => Koninklijke Militaire School
                            )
     
                    )
     
                [1] => 0
            )
     
        [1] => Array
            (
                [0] => Array
                    (
                        [id] => 7
                        [title] => 2 KMS
                        [school] => Array
                            (
                                [id] => 1
                                [title] => KMS
                                [fulltitle] => Koninklijke Militaire School
                            )
     
                    )
     
                [1] => 2   --------> ICI LE NOMBRE D'ETUDIANTS POUR CETTE CLASSE
            )

  13. #13
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Pourquoi ca ne marche pas ?

    Pour les 0 et les 1 ok, c'est vrai que c'est hideux à utiliser la. En meme temps je suis dépassé la, je sais pas du tout comment faire mieux. Sélectionner chacun des élèves pour finalement juste les compter c'est encore plus moche !

    Ya forcément un moyen...

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Voilà ce que doctrine génère comme requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT c, COUNT(s), y FROM Stcw\StudentBundle\Entity\Classe c LEFT JOIN c.school y LEFT JOIN c.students s GROUP BY c.id ORDER BY y.id ASC, c.title ASC
    et voici ce que devrait donner une requête sql testée et fonctionnelle dans phpmyadmin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(c.id) AS total, c.*, s.id FROM classe c LEFT JOIN student s ON c.id = s.classe_id GROUP BY c.id ORDER BY c.title

Discussions similaires

  1. Compter le nombre d'entrées dans une table
    Par gégé140488 dans le forum Hibernate
    Réponses: 5
    Dernier message: 24/09/2010, 16h22
  2. [MySQL] Compter le nombre d'entrées dans une colonne
    Par gastoncs dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2009, 22h09
  3. Compter le nombre d'entrées dans une BDD avec condition
    Par iFlo1 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 29/03/2009, 21h33
  4. Compter le nombre d'entrée avec condition
    Par Seta-san dans le forum Langage
    Réponses: 5
    Dernier message: 17/02/2009, 12h20
  5. Compter un nombre d'entré
    Par Nadd dans le forum Langage
    Réponses: 8
    Dernier message: 11/04/2006, 19h07

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