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 :

QueryBuilder avec count()


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Par défaut QueryBuilder avec count()
    Salut à tous !

    Je suis entrain de développer un forum, je suis à l'étape ou je souhaite récupérer le nombre de topic par forum et de l'afficher.

    Je procède comme ceci :

    ForumController.php :

    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
    <?php
     
    namespace Sds\ForumBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
     
     
    class ForumController extends Controller
    {
     
        public function indexAction()
        {		
    		$em = $this->getDoctrine()->getEntityManager();
    		$repository = $em->getRepository('SdsForumBundle:Categorie');
     
    		$listeCategories = $repository->getCategorieAvecForums();
     
    		$em = $this->getDoctrine()->getEntityManager();
    		$repository = $em->getRepository('SdsForumBundle:Forum');
     
    		$listeNbTopics = $repository->getNbTopicParForums();
     
     
            return $this->render('SdsForumBundle:Forum:index.html.twig', array('listeCategories' => $listeCategories, 
    																			'listeNbTopics' => $listeNbTopics));
        }
    }
    getCategorieAvecForums() :


    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
    <?php
     
    namespace Sds\ForumBundle\Entity;
     
    use Doctrine\ORM\EntityRepository;
     
    /**
     * CategorieRepository
     *
     * This class was generated by the Doctrine ORM. Add your own custom
     * repository methods below.
     */
    class CategorieRepository extends EntityRepository
    {
     
    	public function getCategorieAvecForums()
    	{
    		$qb = $this->createQueryBuilder('c')
    				   ->join('c.forums', 'f')
    				   ->addSelect('f')
    				   ->orderBy('c.ordre', 'ASC');
     
    		return $qb->getQuery()
    				   ->getArrayResult();
    	}
     
    }
    getNbTopicParForums :

    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
    <?php
     
    namespace Sds\ForumBundle\Entity;
     
    use Doctrine\ORM\EntityRepository;
     
    /**
     * ForumRepository
     *
     * This class was generated by the Doctrine ORM. Add your own custom
     * repository methods below.
     */
    class ForumRepository extends EntityRepository
    {
    	public function getNbTopicParForums()
    	{
    		$qb = $this->createQueryBuilder('f')
    				   ->join('f.topics', 't')
    				   ->addSelect('COUNT(t)')
    				   ->groupBy('f.id');
     
    		return $qb->getQuery()
    				   ->getScalarResult();
    	}	
    }
    Ma vue :

    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
    {# src/Sds/ForumBundle/Resources/views/Forum/index.html.twig #}
     
    {% extends "SdsSiteBundle::layout.html.twig" %}
     
    {% block title %}Forum - {{ parent() }}{% endblock %}
     
    {% block sdssite_body %}
     
    <div id="forum">
     
    		{% for categories in listeCategories %}
    		<div id="globalforum">
    			<div id="catforums">
    					<table class="categories">
    						<thead>
    							<th style="text-align: left; width: 340px;"><a href="">{{ categories.nom }}</a></th>
    							<th style="width: 80px;">SUJETS</th>
    							<th style="width: 80px;">MESSAGES</th>
    							<th style="text-align: center; width: 240px;">DERNIER MESSAGE</th>
    						</thead>
     
    					{% for forums in categories.forums %}
     
    							<tbody class="forums">
    								<tr>
    									<td>
    										<a href="">{{ forums.name }}</a><br />
    										{{ forums.description }}
    									</td>
    									<td style="text-align: center;">
    										{% for nbtopic in listeNbTopics %}
    											{{ nbtopic }}
    										{% endfor %}
    									</td>
    									<td style="text-align: center;">test</td>
    									<td style="text-align: center;">test</td>
    								</tr>
    							</tbody>
     
     
    					{% endfor %}
    					</table>
    			</div>
    		</div>
    		{% endfor %}
     
    </div>
     
    {% endblock %}
    Voici l'erreur qu'il en découle :

    An exception has been thrown during the rendering of a template ("Notice: Array to string conversion in /homepages/44/d319387792/htdocs/skydreamsoft/app/cache/dev/twig/56/72/ccd192858f95c3814baf804398e6.php line 88") in ::layout.html.twig at line 128.
    Si quelqu'un aurait une idée ?

    Je vous remercie d'avance !

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pas besoin de faire de jointure avec doctrine

    sinon pour le reste y'a ni de ligne 88 ni de ligne 128

    ps : t’utilise quelle version de Symfony ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Par défaut
    Symfony 2.0.15.

    Sinon tu aurais un exemple à me donner ?

    là j'ai changé ma méthode :

    Mon controller :

    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
    public function indexAction()
        {		
    		$em = $this->getDoctrine()->getEntityManager();
    		$repository = $em->getRepository('SdsForumBundle:Categorie');
     
    		$listeCategories = $repository->getCategorieAvecForums();
     
    		$em = $this->getDoctrine()->getEntityManager();
    		$repository = $em->getRepository('SdsForumBundle:Forum');
     
    		$listeNbTopics = $repository->getNbTopicParForums();
     
    		$em = $this->getDoctrine()->getEntityManager();
    		$repository = $em->getRepository('SdsForumBundle:Topic');
     
    		$listeNbMessages = $repository->getNbMessageParTopics();
     
     
            return $this->render('SdsForumBundle:Forum:index.html.twig', array('listeCategories' => $listeCategories, 
    																			'listeNbTopics' => $listeNbTopics,
    																			'listeNbMessages' => $listeNbMessages));
        }
    Mon getNbTopicParForums() :

    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
    public function getNbTopicParForums()
    	{
    		$qb = $this->createQueryBuilder('f')
    				   ->join('f.topics', 't')
    				   ->addSelect('COUNT(t)')
    				   ->groupBy('f.id');
     
    		$entites = $qb->getQuery()
    				   ->getScalarResult();
     
    		foreach ($entites as $valeur)
    		{
    			return $valeur;
    		}
    	}
    ma vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <td style="text-align: center;">
    										{% for nbtopic in listeNbTopics %}
    											<span style="font-size: 10px; font-weight: bold">{{ nbtopic }}</span>
    										{% endfor %}
    									</td>
    Là plus d'erreur mais ce n'est pas ce que je veux.

    Je souhaite simplement compter le nombre de topics par forum et l'afficher.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    y'a trop de chose dans ton controller, utilise l'ORM correctement,

    si tu veux affichier le nombre de topic pour chaque forum par catagorie dans ton controller c'est juste


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
     * @Template()
     */
    public function indexAction()
    {		
        $em = $this->getDoctrine()->getEntityManager();
        $categories= $em->getRepository('SdsForumBundle:Categorie')->findAll();
     
        return array('categories' => $categories);
    }

    dans la vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {% for category in categories %}
     
        {% for forum in category.forums %}
     
            {{ forum.topics|length }}
     
        {% endfor %}
     
    {% endfor %}
    profite en pour nettoyer aussi ton HTML, le style c'est dans le CSS pas dans le code

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    y'a trop de chose dans ton controller, utilise l'ORM correctement,

    si tu veux affichier le nombre de topic pour chaque forum par catagorie dans ton controller c'est juste


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function indexAction()
    {		
        $em = $this->getDoctrine()->getEntityManager();
        $categories= $em->getRepository('SdsForumBundle:Categorie')->findAll();
     
        return array('categories' => $categories);
    }

    dans la vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {% for category in categories %}
     
        {% for forum in category.forums %}
     
            {{ forum.topics|length }}
     
        {% endfor %}
     
    {% endfor %}
    profite en pour nettoyer aussi ton HTML, le style c'est dans le CSS pas dans le code
    Effectivement, c'est beaucoup plus simple et rapide comme ça. Bon ça avance, mais ce n'est pas encore ce que je veux.

    Pour info j'ai 1 topic de crée pour le forum 1.

    Voilà ce qu'il m'affiche :


  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    et qu'est que tu veux ? compléter le reste ?

  7. #7
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $qb = $this->createQueryBuilder('f')
    				   ->join('f.topics', 't')
    				   ->addSelect('COUNT(t)')
    				   ->groupBy('f.id');
    resulte en une requete SQL du genre "SELECT t.*,COUNT(t) FROM Topic.
    généralement tu récupereras un tableau à deux dimensions,
    chaque ligne étant composé de deux items l'entité topic et le count

    si tu ne veux récupérer que le count fait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $qb = $this->createQueryBuilder('f')
    				   ->join('f.topics', 't')
    				   ->select('COUNT(t)')//la méthode select remplace tout ce qui était auparavant dans le select, en revanche la méthode addSelect ajoute à la suite du select 
    				   ->groupBy('f.id');
    en DQL je ferais plutot un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT f.id, COUNT(t) FROM Forum f JOIN f.topics t GROUP BY f
    avec un traitement php à la récupération pour avoir un tableau des count indexé par id de forum

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

Discussions similaires

  1. requête avec COUNT ?
    Par delphim dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/02/2005, 14h46
  2. Access/SQL : Problème avec Count
    Par Taurëndil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/01/2005, 15h49
  3. [CR] incrementer avec count dans deux etat lieés
    Par souad26 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 08/11/2004, 17h18
  4. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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