Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête Php sous symfony4

Sujet résolu
    17 septembre 2019 à 16:16:37

    Bonjour à tous,

    Je récupère une variable en js que je fais passer en URL à mon controler.

    $("#searchVille").click(function () {
       //Récupération de la date de début de location  
       var jourDebutLoc = $("select[name='location[dateDebutLoc][day]'] > option:selected").text();
           jourDebutLoc = jourDebutLoc.padStart(2,'0');
       var moisDebutLoc = $("select[name='location[dateDebutLoc][month]'] > option:selected").val();
           moisDebutLoc = moisDebutLoc.padStart(2,'0');
       var anneeDebutLoc = $("select[name='location[dateDebutLoc][year]'] > option:selected").text();
       var dateDebutLoc = anneeDebutLoc + "-" + moisDebutLoc + "-" + jourDebutLoc ;
       console.log('date : ', dateDebutLoc);
       
        // Récupération du fichier Xml
        xmlhttp.open("GET", "/loc_toto/allLoueursXml?dateDeb=" + dateDebutLoc, false);
        xmlhttp.overrideMimeType("text/xml");
        xmlhttp.send();
        var xmlDoc = xmlhttp.responseXML;
    ....


    Mon controller récupère la variable pour la faire passer à la requête

    /**
         * @Route("/loc_toto/allLoueursXml/{dateDebutLoc}", name="all_loueurs_xml")
         * @param Date $dateDebutLoc
         */
        public function allLoueursXml(LocationRepository $repo, $dateDebutLoc) {
            
            $loueurs = $repo->findAllLoueursWithDispo($dateDebutLoc);
            //$loueurs = $repo->findAll();
            //var_dump($loueurs);
    
            $listeLoueurs = ['marker' => []];
            foreach ($loueurs as $loueur) {
                $listeLoueurs['marker'][] = [
    ....

    Et voici ma requête

     public function findAllLoueursWithDispo ($dateDebutLoc) {
            $entityManager = $this->getEntityManager();
        
            $query = $entityManager->createQuery(
                'SELECT *
                 FROM location_balise lbd
                 RIGHT JOIN location loc ON loc.id = lbd.location_id
                 RIGHT JOIN balise bal ON bal.id = lbd.balise_id
                 WHERE bal.fonctionnel = true
                 AND loc.date_debut_loc NOT IN ("dateDebutLoc")
                 OR loc.date_debut_loc IS NULL'
            )->setParameter('dateDebutLoc', $dateDebutLoc);
    
             // returns an array of Product objects
             return $query->execute();
        }

    Voici l'erreur :

    GET http://127.0.0.1:8000/loc_toto/allLoueursXml?dateDeb=2014-01-01 404 (Not Found)


    A mon avis le problème vient de mon JS et de l'envoi du paramètre dans l'URL. Comment dois-je écrire tout celà ?

    -
    Edité par ElodieMartin13 23 septembre 2019 à 12:01:51

    • Partager sur Facebook
    • Partager sur Twitter
      17 septembre 2019 à 16:27:32

      Salut !

      Peut-être que tu as oublié un préfixe lors de la génération de ta route en JavaScript ?

      A noter que ton DQL va poser problème en l'état : tu lies une valeur à un paramètre qui n'existe pas dans la requête.

      • Partager sur Facebook
      • Partager sur Twitter
        17 septembre 2019 à 16:59:27

        Merci Ymox pour ta réponse.

        Hum... Je me suis trompée de route, celle-là récupère le fichier de ma requête, il faut que j'en fasse une autre pour envoyer le paramètre.

        Mais aucune idée de comment on fait ! :(

        Par contre je ne comprends pas ton 2eme point, pour moi j'ai lié les deux ainsi : 

         AND loc.date_debut_loc NOT IN ("dateDebutLoc")
                    OR loc.date_debut_loc IS NULL'
               )->setParameter('dateDebutLoc', $dateDebutLoc);

        Comment dois-je faire dans ce cas ?

        • Partager sur Facebook
        • Partager sur Twitter
          17 septembre 2019 à 17:03:34

          ElodieMartin13 a écrit:

          Mais aucune idée de comment on fait ! :(

          Tu ne sais pas comment créer une route ? C'est du texte qui fait du code, tu as fourni un exemple dans ton second bloc de code du premier message, je crois que tu devrais pouvoir t'en sortir  ;)

          ElodieMartin13 a écrit:

          Par contre je ne comprends pas ton 2eme point

          Un paramètre dans une requête (on appelle plutôt ça marqueur, au temps pour moi) n'est pas juste une suite de caractères, il faut soit que cette suite commence par :, soit remplacer toute cette suite par un simple ?.

          • Partager sur Facebook
          • Partager sur Twitter
            18 septembre 2019 à 12:04:52

            Ymox a écrit:

            Tu ne sais pas comment créer une route ? C'est du texte qui fait du code, tu as fourni un exemple dans ton second bloc de code du premier message, je crois que tu devrais pouvoir t'en sortir  ;)

            Ben j'ai fait la même chose que celle du dessous en passant le paramètre sauf que tu m'as dit qu'elle est fausse, qu'il manque un prefixe et que je ne vois pas du tout ce que tu veux dire.

             // Envoi du paramètre au Controller
               xmlhttp.open("GET", "/loc_toto/allLoueursXml"+dateDebutLoc, false);



            ElodieMartin13 a écrit:

            Un paramètre dans une requête (on appelle plutôt ça marqueur, au temps pour moi) n'est pas juste une suite de caractères, il faut soit que cette suite commence par :, soit remplacer toute cette suite par un simple ?.

            Ceci serait-il mieux ?

            public function findAllLoueursWithDispo ($dateDebutLoc) {
                    $entityManager = $this->getEntityManager();
                
                    $query = $entityManager->createQuery(
                        'SELECT *
                         FROM location_balise lbd
                         RIGHT JOIN location loc ON loc.id = lbd.location_id
                         RIGHT JOIN balise bal ON bal.id = lbd.balise_id
                         WHERE bal.fonctionnel = true
                         AND loc.date_debut_loc NOT IN :dateDebutLoc
                         OR loc.date_debut_loc IS NULL'
                    )->setParameter('dateDebutLoc', $dateDebutLoc);
            
                     // returns an array of Product objects
                     return $query->execute();
                }




            -
            Edité par ElodieMartin13 24 septembre 2019 à 11:15:28

            • Partager sur Facebook
            • Partager sur Twitter
              18 septembre 2019 à 12:17:59

              ah en fait tu as créé 2 topics pour le même problème... pas très pratique pour coordonner l'aide qu'on t'apporte...
              • Partager sur Facebook
              • Partager sur Twitter
                18 septembre 2019 à 13:00:26

                Oui j'ai refait un topic afin d'avoir un titre plus explicite pour mon pb actuel qui est plus un problème de requête que de formulaire...
                • Partager sur Facebook
                • Partager sur Twitter
                  18 septembre 2019 à 13:21:23

                  ElodieMartin13 a écrit:

                  Oui j'ai refait un topic afin d'avoir un titre plus explicite pour mon pb actuel qui est plus un problème de requête que de formulaire...


                  Mauvaise pratique pour modifier un titre, il faut éditer le premier post du topic ;)

                  Tu le sauras pour les prochaines fois.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 septembre 2019 à 14:48:30

                    Ralchimist,

                    Merci pour ton explication.

                    Maintenant comment puis-je savoir ce qui cloche dans mon controller vu que je n'arrive pas à récupérer les résultats de ma requête ?

                    J'ai essayé d'installer FOSJsRoutingBundle en suivant ce lien : https://symfony.com/doc/master/bundles/FOSJsRoutingBundle/installation.html

                    Je suis sous symfony 4, du coup pour l'étape 2 je n'ai pas appKernel.php je coup j'ai mis dans Config - bundles.php cette ligne :

                    FOS\JsRoutingBundle\FOSJsRoutingBundle::class => ['all' => true],

                    Et pour l'étape 3, je n'ai pas trouvé le fichier config/routes/fos_je_routing.yml du coup je l'ai créé

                    Mais apparement j'ai pas fait les choses comme il faut car il me dit que Routing n'est pas défini

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 septembre 2019 à 15:03:22

                      pour FOSJSRouting, suis plutôt ce tuto: https://symfonycasts.com/screencast/webpack-encore-legacy/fos-js-routing-bundle

                      Pour tester ton controlleur, il te suffit de mettre taper ton url directement dans la barre d'adresse:

                      http://127.0.0.1:8000/loc_dial/allLoueursXml/2019-09-18   (enfin tu mets la date que tu veux)

                      Comme ça tu travailles directement sur ton controlleur et les erreurs s'afficheront. Et une fois que tu auras ce que tu veux, tu pourras retourner voir si ça fonctionne via ton xlmhttp.open.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 septembre 2019 à 15:08:17

                        EDIT - Ben en fait j'ai fait un mixte des 2 tutos !

                        Alors j'ai des erreurs mais je ne comprends absolument rien !

                        HTTP 500 Internal Server Error
                        [Syntax Error] line 0, col 7: Error: Expected IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | PartialObjectExpression | "(" Subselect ")" | CaseExpression, got '*'

                         Quelqu'un peut me traduire svp ?

                        Sachant que lorsque je fais ma requête en passant par PhpMy Admin, elle fonctionne !

                        -
                        Edité par ElodieMartin13 18 septembre 2019 à 15:38:19

                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 septembre 2019 à 15:21:09

                          Traduction: le caractère joker SQL n'est pas interprété ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 septembre 2019 à 16:14:39

                            Bon alors, j'ai résolu pas mal d'erreur, par contre celle-ci je ne vois pas du tout comment faire.

                            [Semantical Error] line 0, col 39 near 'location_balise': Error: Class 'location_balise' is not defined.

                            En fait il s'agit d'une table supplémentaire qui a été créé car j'ai 2 ManyToMany. Du coup l'entité n'existe pas, et la table n'existe que dans la base de données. 

                            Une astuce ?

                            -
                            Edité par ElodieMartin13 23 septembre 2019 à 12:04:27

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 septembre 2019 à 16:17:13

                              Alors attention, avec createQuery(), ce n'est plus du SQL qu'il faut faire, mais une variante propre à Doctrine. Tu n'utilises plus les tables et les colonnes, mais les entités et les propriétés de celles-ci. Ce qui fait qu'en cas de ManyToMany, ce qui est matérialisé par une table de liaison dans la base de données n'apparaît pas en DQL, parce que cette table de liaison n'est pas une entité.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 septembre 2019 à 16:46:42

                                Alors j'ai retravaillé ma requête et ca donne ceci :

                                public function findAllLoueursWithDispo ($dateDebutLoc) {
                                        $entityManager = $this->getEntityManager();
                                    
                                        $query = $entityManager->createQuery(
                                            'SELECT loc, bal
                                             FROM Location loc 
                                             RIGHT JOIN Balise bal ON bal.locations = loc.balise_id
                                             WHERE bal.fonctionnel = true
                                             AND loc.dateDebutLoc NOT IN :dateDebutLoc
                                             OR loc.dateDebutLoc IS NULL'
                                        )->setParameter('dateDebutLoc', $dateDebutLoc);
                                
                                         // returns an array of Product objects
                                         return $query->execute();
                                    }


                                Par contre mon entité Location apparait en bleu (dans mon code) comme les mots en majuscule et j'ai le message d'erreur suivant alors que mon entité Location.php existe bien !

                                [Semantical Error] line 0, col 34 near 'Location AS loc': Error: Class 'Location' is not defined.
                                



                                -
                                Edité par ElodieMartin13 23 septembre 2019 à 12:05:17

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  18 septembre 2019 à 16:57:25

                                  Alors un premier souci est que RIGHT JOIN n'existe pas pour Doctrine (cf. ici aussi).

                                  Ensuite, je crois qu'il ne faut pas donner que le nom de l'entité, mais il faut le précéder avec l'espace de nom (donc genre \App\Entity\Location).

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 septembre 2019 à 10:58:29

                                    Alors j'ai retravaillé ma requête :

                                    public function findAllLoueursWithDispo ($dateDebutLoc) {
                                            $entityManager = $this->getEntityManager();
                                        
                                            $query = $entityManager->createQueryBuilder();
                                            $query -> SELECT ('loc, bal');
                                            $query -> FROM ('\App\Entity\Location', 'loc');
                                            $query -> JOIN ('\App\Entity\Balise', 'bal', 'WITH', 'bal.locations = loc.balise_id');
                                            $query -> WHERE ('bal.fonctionnel = true');
                                            $query -> ANDWHERE($query->expr() -> notIn ('loc.dateDebutLoc', ':dateDebutLoc'));
                                            $query -> ORWHERE($query->expr() -> isNull('loc.dateDebutLoc'));
                                            $query -> setParameter('dateDebutLoc', $dateDebutLoc);
                                            $results = $query -> getQuery() -> getResult();
                                           
                                           
                                             // returns an array of Product objects
                                             return $results;
                                        }

                                    Mais il ne veut pas prendre mes attributs, j'ai pourtant mis ceux de mes entités 

                                    [Semantical Error] line 0, col 93 near 'locations = loc.balise_id': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
                                    

                                    -
                                    Edité par ElodieMartin13 23 septembre 2019 à 12:06:07

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 septembre 2019 à 11:04:51

                                      je ne réponds pas directement à ton problème, mais pourquoi n'utilises-tu pas les Repository? Ta requête serait beaucoup plus simple et ton code serait mieux organisé.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 septembre 2019 à 11:15:40

                                        Ma requête se trouve dans mon fichier repository.

                                        Et ensuite, depuis mon controller j'appelle mon repository.

                                          $loueurs = $repo->findAllLoueursWithDispo($dateDebutLoc);

                                        Comment dois-je faire pour que ce soit plus simple et que ca fonctionne ?

                                        -
                                        Edité par ElodieMartin13 23 septembre 2019 à 12:06:25

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 septembre 2019 à 11:23:12

                                          en utilisant la syntaxe du QueryBuilder pour la jointure:
                                          (je mets un truc un peu au hasard car je n'ai pas le détail de tes entités)

                                          $this->createQueryBuilder('loc')
                                                      ->leftJoin('loc.baliseDial', 'bal')
                                                      ->where('bal.fonctionnel = true')         
                                                  ;

                                          etc. pour la suite

                                          -
                                          Edité par Ralchimist 19 septembre 2019 à 11:23:40

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 septembre 2019 à 11:57:44

                                            Alors voici ma requête modifiée, elle fonctionne presque. Elle m'enlève bien les locations qui sont faites à la date donnée sauf qu'elle ne m'affiche pas les loueurs qui ont une valeur nulle dans la date. C'est ce que me permettait de faire le rightJoin.

                                            Comment puis-je faire ?

                                            public function findAllLoueursWithDispo ($dateDebutLoc) {
                                                    
                                                    $query = $this->createQueryBuilder('loc');
                                                    $query -> LEFTJOIN ('loc.balise_id', 'bal');
                                                    $query -> WHERE ('bal.fonctionnel = true');
                                                    $query -> ANDWHERE($query->expr() -> notIn ('loc.dateDebutLoc', ':dateDebutLoc'));
                                                    $query -> ORWHERE($query->expr() -> isNull('loc.dateDebutLoc'));
                                                    $query -> setParameter('dateDebutLoc', $dateDebutLoc);
                                                    $results = $query -> getQuery() -> getResult();
                                                    //$query -> getResult();
                                                   
                                                     // returns an array of Product objects
                                                     return $results;
                                                }
                                            



                                            -
                                            Edité par ElodieMartin13 24 septembre 2019 à 11:15:56

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 septembre 2019 à 12:25:11

                                              tu peux me montrer tes entités? Je ne comprends pas bien les relations.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                19 septembre 2019 à 12:40:26

                                                /**
                                                 * @ORM\Entity(repositoryClass="App\Repository\LocationRepository")
                                                 */
                                                class Location {
                                                    /**
                                                     * @ORM\Id()
                                                     * @ORM\GeneratedValue()
                                                     * @ORM\Column(type="integer")
                                                     */
                                                    private $id;
                                                
                                                    /**
                                                     * @ORM\Column(type="date")
                                                     */
                                                    private $dateDebutLoc;
                                                
                                                    /**
                                                     * @ORM\Column(type="time")
                                                     */
                                                    private $heureDebutLoc;
                                                
                                                    /**
                                                     * @ORM\Column(type="date")
                                                     */
                                                    private $dateFinLoc;
                                                
                                                    /**
                                                     * @ORM\Column(type="time")
                                                     */
                                                    private $heureFinLoc;
                                                
                                                    /**
                                                     * @ORM\Column(type="datetime", nullable=true)
                                                     */
                                                    private $dateHeureRecup;
                                                
                                                    /**
                                                     * @ORM\Column(type="datetime", nullable=true)
                                                     */
                                                    private $dateHeureRest;
                                                
                                                      /**
                                                     * @ORM\Column(type="integer")
                                                     */
                                                    private $nbLoue;
                                                
                                                    /**
                                                     * @ORM\ManyToMany(targetEntity="App\Entity\Balise", inversedBy="locations")
                                                     * * @ORM\JoinColumn(nullable=false)
                                                     */
                                                    private $balise_id;
                                                
                                                    /**
                                                     * @ORM\ManyToOne(targetEntity="App\Entity\Loueur", inversedBy="locations")
                                                     * @ORM\JoinColumn(nullable=false)
                                                     */
                                                    private $loueurs;
                                                
                                                    /**
                                                     * @ORM\ManyToOne(targetEntity="App\Entity\Utilisateur", inversedBy="locations")
                                                     * @ORM\JoinColumn(nullable=false)
                                                     */
                                                    private $utilisateurs;
                                                

                                                /**
                                                 * @ORM\Entity(repositoryClass="App\Repository\BaliseRepository")
                                                 */
                                                class Balise
                                                {
                                                    /**
                                                     * @ORM\Id()
                                                     * @ORM\GeneratedValue()
                                                     * @ORM\Column(type="integer")
                                                     */
                                                    private $id;
                                                
                                                    /**
                                                     * @ORM\Column(type="string", length=255)
                                                     */
                                                    private $identifiantBalise;
                                                
                                                
                                                    /**
                                                     * @ORM\Column(type="boolean")
                                                     */
                                                    private $fonctionnel;
                                                
                                                    /**
                                                     * @ORM\OneToOne(targetEntity="App\Entity\Loueur", inversedBy="balise_id", cascade={"persist", "remove"})
                                                     */
                                                    private $loueur;
                                                
                                                    /**
                                                     * @ORM\ManyToMany(targetEntity="App\Entity\Location", mappedBy="balise_id")
                                                     */
                                                    private $locations;

                                                -
                                                Edité par ElodieMartin13 24 septembre 2019 à 11:16:23

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  19 septembre 2019 à 12:47:06

                                                  il faut prendre le "problème" dans le bon sens. S'il n'y a pas de RightJoin dans Doctrine, c'est que ce n'est pas naturel.

                                                  Que veux-tu récupérer? Une liste de locations ou une liste de loueurs?

                                                  Là (si je ne me trompe pas) tu es dans le LocationRepository, c'est bien ça? Donc tu récupères une liste de locations.

                                                  Si tu veux une liste de loueurs, alors il faut mettre ta méthode dans le LoueurRepository et adapter ta requete dans l'autre sens:

                                                  Loueur innerJoin BaliseDial leftJoin Location

                                                  -
                                                  Edité par Ralchimist 19 septembre 2019 à 12:52:45

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    19 septembre 2019 à 12:55:28

                                                    Tu ne te trompes pas, je suis bien dans Location Repository !

                                                    La requête est bien plus complexe que cela.

                                                    Il faut que j'ai la liste des balises disponible aux dates de réservation. Une fois que j'ai cette liste il faut que je calcul combien il y a de balise par loueur.

                                                    Et ensuite mon script ajax s'occupe d'afficher les loueurs à proximité et ayant assez de stock en fonction de la quantité commandée.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      19 septembre 2019 à 13:24:42

                                                      Je te suggère dans un premier temps de changer ta variable $baliseDial_id par $baliseDial (avec Doctrine, on travaille directement avec les objets)

                                                      Si tu as besoin d'une liste de BaliseDial, alors tu peux faire ta requete à partir de ton BaliseDialRepository.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        19 septembre 2019 à 16:03:16

                                                        Merci Ralchimist, ca fonctionne !

                                                        Maintenant que je récupère la liste des balises dispo, j'ai besoin de connaître la quantité par Loueur, du coup j'ai fait ceci :

                                                         /**
                                                             * @Route("/loc/allLoueursXml/{dateDebutLoc}", name="all_loueurs_xml")
                                                             * @Route("/loc/allLoueursXml", name="all_loueurs")
                                                             * @param Date $dateDebutLoc
                                                             */
                                                            public function allLoueursXml(BaliseRepository $repo, $dateDebutLoc) {
                                                                
                                                                $balises = $repo->findAllDispo ($dateDebutLoc);
                                                                //$loueurs = $repo->findAll();
                                                               //var_dump($loueurs);
                                                               
                                                                $count = [];
                                                                $listeBalises = ['marker' => []];
                                                                foreach ($balises as $balise) {
                                                                    $idBalise = $balise->getId();
                                                                    $idLoueur = $balise->getLoueur()->getId();
                                                                    $nom = $balise->getLoueur()->getNom();
                                                                    $adresse = $balise->getLoueur()->getAdresse();
                                                                    $cp = $balise->getLoueur()->getCp();
                                                                    $ville = $balise->getLoueur()->getVille();
                                                                    $lat = $balise->getLoueur()->getLatitude();
                                                                    $lng = $balise->getLoueur()->getLongitude();
                                                                    $nb = $balise->getLoueur()->getNbLoc();
                                                                 
                                                                        if(array_key_exists($idLoueur, $count)){    
                                                                            $count[$idLoueur] = $count[$idLoueur] + 1 ;
                                                                        } else $count[$idLoueur] = 1 ;
                                                               
                                                                    }
                                                                    $listeBalises['marker'][] = [
                                                                        '@idBalise' => $idBalise, 
                                                                        '@idLoueur' => $idLoueur,
                                                                        '@nom' => $nom,
                                                                        '@adresse' => $adresse,
                                                                        '@cp' => $cp,
                                                                        '@ville' => $ville,
                                                                        '@lat' => $lat,
                                                                        '@lng' => $lng,
                                                                        '@nb' => $nb,
                                                                        '@Dispo' => $count[$idLoueur],
                                                                        ];  
                                                                          
                                                        
                                                        
                                                                
                                                                var_dump($listeBalises) ; 
                                                        
                                                                $xmlEncoder = new XmlEncoder();
                                                                $loueursXml = $xmlEncoder->encode($listeBalises, 'xml', ['xml_format_output' => true,
                                                                                                                         'xml_encoding' => 'utf-8',
                                                                                                                         'xml_root_node_name' => 'markers'
                                                                                                                         ]);
                                                                
                                                                return new Response($loueursXml);
                                                           
                                                            }

                                                        Je suis pas bien loin.... si je créé mon tableau à l'intérieur de la boucle for il me créé toute les lignes en incrémentant la colonne nbDispo.

                                                        Et si je sort la création de mon tableau, il ne me crée qu'une seule ligne...

                                                        Grrrr !!!

                                                        -
                                                        Edité par ElodieMartin13 24 septembre 2019 à 11:16:43

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          19 septembre 2019 à 16:52:33

                                                          Doctrine propose des solutions pour regrouper selon certains critères et pour compter des choses, pourquoi ne tenterais-tu pas de les utiliser pour alléger ton script et gagner un peu en performances ? Une base de données est faite pour permettre ce genre d'opérations facilement  :)

                                                          Avec l'objet QueryBuilder de Doctrine, si j'ai bien compris ce que tu souhaites faire, il faudrait ajouter la sélection du champ qui va permettre de compter (quelque chose comme addSelect('count(loueur.id)) et la clause de regroupement sur l'ID de l'objet Location (groupBy('loc.Id')). Au passage, si tu sais comment faire en pur SQL, il ne devait te manquer que les noms des méthodes à appeler.

                                                          La seule chose qui pourrait être gênante, c'est le format de résultat avec Doctrine quand on fait ces comptes, mais on verra ça par la suite.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            20 septembre 2019 à 9:56:01

                                                            Bonjour Ymox,

                                                            Merci pour ces précieux conseils.

                                                            Voici ma nouvelle requête. Mais je me retrouve avec le même problème qu'avant c'est à dire qu'il me retourne :

                                                            array(1) { [1]=> string(1) "6" }

                                                            public function findAllDispo ($dateDebutLoc) {
                                                                    
                                                                    $query = $this->createQueryBuilder('bal');
                                                                    $query -> LEFTJOIN ('bal.locations', 'loc');
                                                                    $query -> SELECT ('count(bal.loueur)');
                                                                    $query -> WHERE ('bal.fonctionnel = true');
                                                                    $query -> ANDWHERE ($query->expr() -> notIn ('loc.dateDebutLoc', ':dateDebutLoc'));
                                                                    $query -> ORWHERE ($query->expr() -> isNull('loc.dateDebutLoc'));
                                                                    $query -> GROUPBY ('bal.loueur');
                                                                    $query -> setParameter ('dateDebutLoc', $dateDebutLoc);
                                                                    $results = $query -> getQuery() -> getResult();
                                                                   
                                                                     // returns an array of Product objects
                                                                     return $results;
                                                                }
                                                            



                                                            Et surtout comment faire pour récupérer ce champs dans le tableau que je crée ensuite ?

                                                            public function allLoueursXml(BaliseRepository $repo, $dateDebutLoc) {
                                                                    
                                                                    $balises = $repo->findAllDispo ($dateDebutLoc);
                                                                    //$loueurs = $repo->findAll();
                                                                   //var_dump($loueurs);
                                                            
                                                                    $listeBalises = ['marker' => []];
                                                                    foreach ($balises as $balise) {
                                                                        $listeBalises['marker'][] = [
                                                                            '@idBalise' => $balise->getId(),
                                                                            '@idLoueur' => $balise->getLoueur()->getId(),
                                                                            '@nom' => $balise->getLoueur()->getNom(),
                                                                            '@adresse' => $balise->getLoueur()->getAdresse(),
                                                                            '@cp' => $balise->getLoueur()->getCp(),
                                                                            '@ville' => $balise->getLoueur()->getVille(),
                                                                            '@lat' => $balise->getLoueur()->getLatitude(),
                                                                            '@lng' => $balise->getLoueur()->getLongitude(),
                                                                            '@nb' => $balise->getLoueur()->getNbLoc(),
                                                                            '@Dispo' => $balise->getCount(),
                                                                        ];



                                                            -
                                                            Edité par ElodieMartin13 23 septembre 2019 à 12:10:58

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              20 septembre 2019 à 10:45:11

                                                              Oublie la construction d'un tableau avec le résultat de la requête, on devrait pouvoir s'en passer. Note que, pour savoir comment sont organisées des données, tu as toujours var_dump() et avec Symfony, tu as dump() tout court.

                                                              Attention, j'avais bien parlé de addSelect(). select('quelquechose') pourrait bien faire que, justement, tu n'aies plus qu'un nombre comme résultat, au mieux une liste de nombres…
                                                              J'aimerais volontiers voir la requête SQL qui est générée par ce QueryBuilder. Dans la barre de débogage, tu trouveras un "onglet" Doctrine, et cela te mène vers une page qui liste toutes les requêtes effectuées pour générer la page, requêtes en DQL comme traduites en SQL.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Requête Php sous symfony4

                                                              × 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