Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête trop lourde

    5 juillet 2020 à 15:07:05

    Bonjour,

    Je tente de récupérer pour chaque région le nombre de villes comportant des événements en cours.

    J'ai donc commencé à faire cela :

    $regionCities = [];
    foreach ($regions as $region) {
        $regionCities[$region->getId()] = $cityRepository->getCitiesByRegion($region);
    }
    
    dump($regionCities);
    
    $regionCitiesNumber = [];
    foreach ($regionCities as $index => $region) {
        foreach ($region as $city) {
            $regionCitiesNumber[$index] = count($city->getCurrentEvents());
        }
    }



    Mon dump me renvoie cela :

    Le problème est que ça fait planter mon script, et j'ai du coup comme résultat une page blanche quand je fais un dump de regionCitiesNumber.

    getCurrentEvents est une méthode de mon entité City qui va récupérer tous les événements en cours.

    public static function createCurrentEventsCriteria(): Criteria
    {
        return Criteria::create()
            ->where(Criteria::expr()->gte('endDate', new DateTime('00:00:00')))
            ->orderBy(['id' => 'DESC'])
        ;
    }
    
     public function getCurrentEvents(): Collection
    {
        $criteria = EventRepository::createCurrentEventsCriteria();
    
        return $this->events->matching($criteria);
    }



    -
    Edité par YinYang2 5 juillet 2020 à 15:09:22

    • Partager sur Facebook
    • Partager sur Twitter
      5 juillet 2020 à 15:43:38

      Bonjour,

      Il faut que tu mettes en place une pagination.

      Si tu veux que cela pagine au scroll, il faut mettre en place un scroll infini avec de l'ajax.

      -
      Edité par eclairia 5 juillet 2020 à 16:17:15

      • Partager sur Facebook
      • Partager sur Twitter
      "Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain
        5 juillet 2020 à 15:52:36

        Je n'ai pas bien compris....

        Je veux juste que mon dump sur $regionCitiesNumber s'affiche dans la barre d'outils de Symfony, je ne veux pas faire de pagination en fait, ce n'est pas du tout mon sujet... :/

        • Partager sur Facebook
        • Partager sur Twitter
          5 juillet 2020 à 16:29:02

          J'avais mal compris ton soucis.

          Rajoute les var_dump ci-dessous à la ligne 11 et donne nous le résultat s'il te plaît:

          var_dump($index);
          var_dump(count($city->getCurrentEvents()));
          die;



          • Partager sur Facebook
          • Partager sur Twitter
          "Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain
            5 juillet 2020 à 18:13:21

            J'ai ce résultat :

            -
            Edité par YinYang2 5 juillet 2020 à 18:13:49

            • Partager sur Facebook
            • Partager sur Twitter
              30 juillet 2020 à 15:42:15

              Bonjour, je relance ce sujet, car je n'ai toujours pas trouvé de solutions à ce problème...
              • Partager sur Facebook
              • Partager sur Twitter
                30 juillet 2020 à 16:03:13

                Salut

                Pourquoi ne pas faire une requête qui compte plutôt qu'une requête qui sélectionne tout et laisse le soin à PHP de compter ? Tu dois afficher la liste en plus du nombre ?

                • Partager sur Facebook
                • Partager sur Twitter
                  30 juillet 2020 à 19:10:50

                  Non je dois afficher seulement le nombre. Alors j'ai tenté :

                  return $this->events->matching($criteria)->count();

                  Et j'ai fait un dump sur regionCitiesNumber, ça m'a sorti un résultat totalement erroné :

                  Par exemple pour la région ARA, je me retrouve avec 0 comme résultat alors qu'il y a 1895 événements répartis sur tous les départements...

                  De plus, ça met énormément de temps pour charger ma page, n'y-a-t-il pas une solution plus soft ?

                  -
                  Edité par YinYang2 30 juillet 2020 à 19:31:11

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 juillet 2020 à 23:11:51

                    Le truc c'est qu'avec le code que tu nous donnes, c'est PHP qui va devoir compter les éléments, et pas le SGBD. Ce qui implique que PHP va récupérer tous les éléments qui correspondent à tes critères (et chaque objet en entier, il n'y a qu'avec une requête que tu peux faire une sélection partielle, la classe Criteria n'est pas adaptée) pour ensuite les compter. Il serait vraiment plus pratique du point de vue des ressources de faire une requête qui compte, avec une clause de regroupement sur les villes. A la limite, histoire de faire à peine moins moche, mettre les relations dans le sens Ville -> Evenement en extra-paresseuses.

                    J'ai l'impression qu'on avait eu une discussion similaire auparavant, je me trompe ?

                    Edit

                    Apparemment, pas vraiment, non.

                    -
                    Edité par Ymox 30 juillet 2020 à 23:17:04

                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 août 2020 à 15:13:35

                      Bonjour,

                      J'ai repris un peu ce que tu m'as dit, en créant une requête pour récupérer le nombre de villes qui ont des événements en cours dans une région.

                      J'ai fait quelque chose comme ça :

                      CityRepository :

                      public function getNbCitiesWithEventsByRegion($region)
                      {
                          $qb = $this->createQueryBuilder('c');
                          $qb->select('COUNT(c.id)')
                              ->join('c.department', 'd')
                              ->join('d.region', 'r')
                              ->join('c.events', 'e', Join::WITH, $qb->expr()->andX(
                                  $qb->expr()->gte('e.endDate', ':date'),
                                  $qb->expr()->eq('e.status', ':status')
                              ))
                              ->where('r = :region')
                              ->setParameters(['region' => $region, 'date' => new DateTime('00:00:00'), 'status' => 'online'])
                              ->groupBy('c.id')
                          ;
                      
                          $query = $qb->getQuery();
                          return $query->getScalarResult();
                      }

                      Et donc en faisant un dump sur le résultat, j'ai quelque chose comme ça :

                      Donc un array de 214 entrées avec 1 comme résultat à chaque fois... Je pense qu'il y a quelque chose que je fais mal mais je ne vois pas quoi.


                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 août 2020 à 15:33:24

                        si tu fait un groupBy c.id c'est un résultat normal qui sort ^^ car chaque identifiant est unique.

                        En supprimnt le group by, tu devrait retrouver le nombre ;)

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Requête trop lourde

                        × 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