Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony4] Problème requete QueryBuilder

    16 septembre 2019 à 20:46:28

    Bonsoir, je viens vers vous parce que depuis ce matin j'ai un problème avec une requete,

    voici mon problème : 

    Je souhaite regroupé les differents "label"  du meme type ensemble et les compter, actuellement ma requete tout les "label" que je recupère mais ils sont pas classé du genre exemple : un fichier json :

    moi je souhaite recevoir par exemple un truc du style :

    "number" : "2",
    "type" : "humains"
    "number" : "1",
    "type" : "heavy"

    voici comment est structure ma bdd :

    et voici ma requete:

    +    public function findArchives($station, $month, $years)
    +    {
    +        $qb = $this->createQueryBuilder('s');
    +
    +        $archives = $qb
    +            ->select('s.id as station, 
    +            e.currentTime as date, 
    +            COUNT(e.label) as number, 
    +            e.label as type,
    +            DAY(e.currentTime) as day
    +            ')
    +            ->join('s.events', 'e')
    +            ->where('s.id =:stationName')
    +            ->andWhere('MONTH(e.currentTime) =:month AND YEAR(e.currentTime) =:year')
    +            ->groupBy('day')
    +            ->setParameter('stationName', $station)
    +            ->setParameter('month', $month)
    +            ->setParameter('year', $years)
    +        ;
    +
    +        return $archives->getQuery()->getResult();
    +    }

    en gros le but final est que je dois récupéré les données d'une station sur un jour précis et les enregistré dans un fichier. j'arrive a tout faire mais j'arrive pas a classer correctement mes données.

     Merci beaucoup

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2019 à 23:28:51

      Salut,

      tu peux utiliser un double groupBy pour récupérer tes résultats par Jour par Type:

      https://stackoverflow.com/questions/2421388/using-group-by-on-multiple-columns

      • Partager sur Facebook
      • Partager sur Twitter
        17 septembre 2019 à 6:32:13

        hello, j’avais essayer le  »addgroupby » mais j’ai pas eu le resultat que je voulais. ma requête est surement a un default. je me suis surement mal explique, je cherche a compter chaque label qui sont sortie le meme jour et les grouper ensemble (exemple compter le nombre d’humans /heavy/light qui sont sortie un jour precis)
        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2019 à 7:14:10

          bonjour, 

          un up s'il vous plait

          • Partager sur Facebook
          • Partager sur Twitter
            18 septembre 2019 à 7:49:02

            si tu connais le jour, alors il te suffit de faire un groupBy('label') avec une condition sur le jour. (mais dans ta requête il me semblait que tu voulais récupérer tous les jours d'un mois)

            • Partager sur Facebook
            • Partager sur Twitter
              18 septembre 2019 à 8:40:51

              Bonjour, en fait je dois affiche des donnes (ex: je fais un filtre sur une station, un mois et une annees)   Donc ca pour cela fonctionne, mais le problemes est que je dois recupere les donnes qui se sont passer dans cette station a ce jour precis
              • Partager sur Facebook
              • Partager sur Twitter
                18 septembre 2019 à 8:59:38

                tu parles de "jour précis" mais tu ne fais le filtre que sur le mois et l'année, c'est normal?
                • Partager sur Facebook
                • Partager sur Twitter
                  18 septembre 2019 à 9:08:52

                  désoler je me suis surement mal exprimer, quand je fais le filtre sur le mois et l'année je recois une liste de stations choisis qui sont associées a cette période, donc oui c'est normal, puis mon groupby() sur day c'est juste pour grouper les memes jours, mais quand je fais un autre groupby()  sur "label" cela casse tout
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 septembre 2019 à 10:28:16

                    alors je te confirme qu'il faut utiliser
                    ->groupBy('day')
                    ->addGroupBy('e.label')
                    et tu obtiendras ça par exemple: (j'ai généré des données au hasard chez moi)
                    array:5 [▼
                      0 => array:3 [▼
                        "date" => DateTime @1568678400 {#1524 ▶}
                        "number" => "2"
                        "type" => "humans"
                      ]
                      1 => array:3 [▼
                        "date" => DateTime @1568678400 {#1505 ▶}
                        "number" => "2"
                        "type" => "light"
                      ]
                      2 => array:3 [▼
                        "date" => DateTime @1568764800 {#1503 ▶}
                        "number" => "1"
                        "type" => "heavy"
                      ]
                      3 => array:3 [▼
                        "date" => DateTime @1568764800 {#1506 ▶}
                        "number" => "2"
                        "type" => "humans"
                      ]
                      4 => array:3 [▼
                        "date" => DateTime @1568851200 {#1525 ▶}
                        "number" => "1"
                        "type" => "humans"
                      ]
                    Chaque entrée du tableau correspond bien à 1 jour et 1 type.
                    Ensuite il te reste juste à gérer ton affichage avec soit une condition sur le changement de date, soit de faire un nouveau tableau à partir de celui là pour regrouper les dates.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 septembre 2019 à 10:41:56

                      Merci d'avoir teste, je recevais effectivement la meme reponse que toi, je pensais que je pouvais tout regroupe dans un meme tableau selon les date, donc je vais partir sur ta deuxième solution, reste a voir comment je vais l'implémenté

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 septembre 2019 à 10:51:35

                        une solution simple:

                        $listeparjours = [];
                        foreach($valeurs AS $val)
                        {
                            $listeparjour[lejour][] = $val;
                        }

                        je te laisse remplacé "lejour" par la date récupéré à partir de $val

                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 septembre 2019 à 13:43:30

                          Salut !

                          En ce qui me concerne, je ne suis pas partisan de faire une boucle pour formater des données puis une autre pour les afficher dans le cas où la seconde n'a pas nécessairement besoin du format généré par la première.

                          Tu cherches à avoir quoi comme affichage au final ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 septembre 2019 à 20:09:59

                            salut, 

                            je montre un schema

                            en gros je récupère mes stations que j'ai filtré avec le mois, l'années et le nom de la stations ( pour le moment j'ai pas de problèmes avec cette partie)

                            puis je doit recupéré toutes les données liée a cette station et mois/années, ces données devront etre classé par ordres (nombre de humans/light etc... par leurs quantité facon) et elles seront affichées dans un fiché cvs que j'ai déja codé. le plus galère c'est de classé c'est données.

                            j'ai fais la méthode de  Ralchimist mais elle me retourne un tableau sans tout groupé enssemble (j'ai surement mal fais ou mal compris)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 septembre 2019 à 22:35:17

                              La méthode qui t'a été proposée est bonne, maintenant je maintiens que tu n'as pas besoin de faire une boucle pour avoir un tableau des données par jours.

                              Regarde ce sujet. L'algorithme donné est indépendant de la requête, il ne se base que sur un ensemble de données. Maintenant, ses films sont tes dates et ses acteurs sont tes types (heavy, human et light). Plus besoin de construire un tableau de type { '2019-08-07': { 'human': 2, 'heavy': 4, 'light': 5} … }. La seule "subtilité" est qu'il faut ordonner par jour et éventuellement par type.

                              -
                              Edité par Ymox 18 septembre 2019 à 22:36:20

                              • Partager sur Facebook
                              • Partager sur Twitter

                              [Symfony4] Problème requete QueryBuilder

                              × 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