Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SYMFONY/DOCTRINE] Faire sans le right Join

Sujet résolu
    8 juin 2016 à 22:12:12

    Bonjour,

    Je suis bloqué sur une requête en DQL.

    J'aimerais tout simplement récupérer pour chaque post, le nombre de likes (opinion) et ordonner les résultats dans l'ordre décroissant de likes.

    Depuis le repository Opinion, je fais donc ceci :

    <?php 
    
    $qb = $this->createQueryBuilder('o');
    $qb
    ->addSelect('COUNT(o.post) AS nbLikes')            
    ->leftJoin('o.post', 'p')             
    ->groupBy('o.post')
    ->orderBy('nbLikes','DESC')
    ->setMaxResults($limit);

    Sauf qu'évidemment, ça n'affiche pas les posts sans likes. Comment faire  ?

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
    Jeu en ligne : http://www.ultimaterra.fr
      9 juin 2016 à 10:39:37

      Si je fais la requête à l'envers ça ne fonctionne pas car le leftJoin attend une référence (clé étrangère au sens sql) vers une autre entité.
      • Partager sur Facebook
      • Partager sur Twitter
      Jeu en ligne : http://www.ultimaterra.fr
        9 juin 2016 à 13:46:03

        Toujours bloqué...

        Pour info, si ce n'est pas clair : j'ai 2 entités (post et opinion). Chaque opinion contient la référence du post en question.

        • Partager sur Facebook
        • Partager sur Twitter
        Jeu en ligne : http://www.ultimaterra.fr
          10 juin 2016 à 10:02:30

          On m'avait dit que Doctrine posait quelques problèmes. Effectivement, c'est le cas si on peut pas faire toutes les requêtes voulues.
          • Partager sur Facebook
          • Partager sur Twitter
          Jeu en ligne : http://www.ultimaterra.fr
            12 juin 2016 à 0:28:40

            salut,

            tu ne peut pas faire cette requête depuis opinion, puisque dans ce cas les posts sans opinion n'apparaissent pas.

            je verrai plus quelque chose dans le genre, dans ton repository post

            $qb = $this->createQueryBuilder('p');
            $qb
            ->addSelect('COUNT(o.id) AS nbLikes')           
            ->leftJoin('p.opinion', 'o')            
            ->groupBy('p.id')
            ->orderBy('nbLikes','DESC')
            ->setMaxResults($limit);



            -
            Edité par lk77 12 juin 2016 à 0:28:58

            • Partager sur Facebook
            • Partager sur Twitter
              12 juin 2016 à 10:32:00

              En effet. Mais comme je l'ai indiqué, dans ce cas, il n'y a aucun attribut pour faire la jointure puisque p.opinion n'existe pas.

              Ou alors je n'ai pas saisi un truc ?

              • Partager sur Facebook
              • Partager sur Twitter
              Jeu en ligne : http://www.ultimaterra.fr
                12 juin 2016 à 12:05:32

                C'est bien pourquoi lk77 fait un leftJoin,

                La requête ne fonctionne pas ?

                T.

                • Partager sur Facebook
                • Partager sur Twitter
                  12 juin 2016 à 12:12:46

                  Pour chaque opinion, j'ai un attribut qui indique le post concerné. En revanche, un post n'a aucune référence vers un opinion puisque un post peut avoir plusieurs opinions. L'attribut opinion de post (p.opinion) n'existe donc pas.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Jeu en ligne : http://www.ultimaterra.fr
                    12 juin 2016 à 12:29:25

                    La relation (pots/opinion) n'aboutit pas a ajouter une propriété "opinions" dans ton post utilisable pour ton leftjoin ?

                    T.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 juin 2016 à 14:36:17

                      Et non puisque un post peut avoir plusieurs opinions. Ou alors je n'ai pas compris tes dires.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Jeu en ligne : http://www.ultimaterra.fr
                        12 juin 2016 à 14:54:13

                        Physique tu n'as pas de colonne mais tu décris les relations à doctrine donc dql devrait être capable de s'en servir sinon à quoi bon ... ?

                        T.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 juin 2016 à 16:59:13

                          Et d'où sort p.opinion alors ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Jeu en ligne : http://www.ultimaterra.fr
                            13 juin 2016 à 14:46:03

                            Salut,

                            Après c'est un exemple, ça dépend de ton modèle de données:

                            De post, tu fait un leftjoin vers opinion quand opinion.post_id = post.id

                            Et sur fait un count de opinion.id

                            $qb = $this->createQueryBuilder('p');
                            $qb
                            ->addSelect('COUNT(o.id) AS nbLikes')          
                            ->leftJoin('opinion', 'o','ON', 'o.post_id = p.id')           
                            ->groupBy('p.id')
                            ->orderBy('nbLikes','DESC')
                            ->setMaxResults($limit);

                            -
                            Edité par lk77 13 juin 2016 à 15:18:02

                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 juin 2016 à 21:21:25

                              D'accord merci. Je pensais qu'il y avait une autre manière de faire. ;)
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Jeu en ligne : http://www.ultimaterra.fr

                              [SYMFONY/DOCTRINE] Faire sans le right Join

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown