Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête Php sous symfony4

Sujet résolu
    24 septembre 2019 à 13:06:14

    OK ca c'est bon ! COOL !!!

    Alors maintenant j'ai mon fichier JS qui envoie la date à mon controller (qui l'a transmet à la requête, récupère le résultat puis renvoie un fichier XML).

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

    Ce même fichier JS doit récupérer ce résultat :

    D'après ce que j'ai cru comprendre, je devais mettre qu'une seule route vers mon controller mais je ne comprends pas comment lui dire d'envoyer une information puis de récupérer le traitement de cette information.

    // Récupération du fichier Xml
        xmlhttp.open("GET", "/loc/allLoueursXml", false);
        xmlhttp.overrideMimeType("text/xml");
        xmlhttp.send();
        var xmlDoc = xmlhttp.responseXML;


    D'autant plus que je comprends que cela ne puisse pas marcher, car la route de ma function a besoin d'un paramètre. Sauf que je n'ai plus besoin de ce paramètre lorsque je récupère le résultat de la requête. Du coup j'ai essayé de mettre 2 routes, mais ca ne fonctionne pas plus

     /**
         * @Route("/loc/allLoueursXml/{dateDebutLoc}", name="all_loueurs_xml")
         * @Route("/loc/allLoueursXml", name="all_loueurs")
         * @param Date $dateDebutLoc
         */
        public function allLoueursXml(LoueurRepository $repo, $dateDebutLoc) {



    -
    Edité par ElodieMartin13 24 septembre 2019 à 13:06:51

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2019 à 13:46:29

      Je pense que c'est dû au paramètre $dateDebutLoc de ton action qui ne peut pas être nul/non renseigné ? Et si tu faisais en sorte que ce paramètre soit optionnel, comme avec une fonction/méthode habituelle ?

      • Partager sur Facebook
      • Partager sur Twitter
        24 septembre 2019 à 15:23:58

        Ok ca c'est fait !

        Par contre lorsque je met la date dans mon formulaire, celle-ci n'est pas prise en compte par ma requête.

        Le format de la date est ok, en console.log la date me sort ainsi :

        date :  2019-10-05


        Il vient d'où le problème ?

        • Partager sur Facebook
        • Partager sur Twitter
          24 septembre 2019 à 15:44:23

          Elle n'est pas prise en compte à quel niveau ? Tu ne la récupères pas dans ton contrôleur, ou c'est au niveau de la requête Doctrine ?

          Sais-tu utiliser la console de réseau (Network sous Chrome) de ton navigateur ? Si oui, est-ce que tu y vois ta date être envoyée au serveur ?
          Si non, comment l'envoies-tu, ce qui revient à te demander comment génères-tu l'URL auquel tu envoies ta requête ?

          Tu te rends bien compte que là, sans information, on ne va que pouvoir tâtonner avec toi, et encore, te dire comment tâtonner ?

          -
          Edité par Ymox 24 septembre 2019 à 15:44:59

          • Partager sur Facebook
          • Partager sur Twitter
            24 septembre 2019 à 15:57:06

            Ben justement je ne sais pas comment voir cela...

            Non je ne sais pas utiliser la console Réseau.

            As-tu des tutos pour que je comprenne comment savoir si je ne le récupère pas auprès de mon contrôleur ou auprès de ma requête?

            Je l'envoi ainsi à mon controlleur :

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

            Je l'envoi ainsi à ma requête :

             /**
                 * @Route("/loc/allLoueursXml/{dateDebutLoc}", name="all_loueurs_xml")
                 * @param Date $dateDebutLoc
                 */
                public function allLoueursXml(LoueurRepository $repo, $dateDebutLoc = '') {
                    
                    $balises = $repo->findAllDispoByLoueur ($dateDebutLoc);



            -
            Edité par ElodieMartin13 24 septembre 2019 à 16:05:40

            • Partager sur Facebook
            • Partager sur Twitter
              24 septembre 2019 à 16:00:43

              Il ne manquerait pas un slash entre allLoueursXml et la date dans ton JavaScript ?

              • Partager sur Facebook
              • Partager sur Twitter
                24 septembre 2019 à 16:08:38

                Euh... si !!! Mais.... il y a autre chose !
                • Partager sur Facebook
                • Partager sur Twitter
                  24 septembre 2019 à 16:30:54

                  Désolé, mais si tu as besoin d'aide, explique ce que tu vois/constates/observes ainsi que ce que tu souhaites voir, sans quoi on va se perdre très rapidement. Là, on est en train de tenter d'identifier une maladie sans avoir le patient sous la main et sans même que quiconque ne nous explique les symptômes…

                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 septembre 2019 à 16:38:41

                    C'est ce que je suis en train de faire.... Je farfouille dans network et je viens de trouver ceci :

                    Request URL: http://127.0.0.1:8000/loc/allLoueursXml/2019-01-01
                    Request Method: GET
                    Status Code: 200 OK
                    Remote Address: 127.0.0.1:8000
                    Referrer Policy: no-referrer-when-downgrade
                    Cache-Control: max-age=0, must-revalidate, private
                    Connection: close
                    Content-Type: text/html; charset=UTF-8
                    Date: Tue, 24 Sep 2019 14:17:40 +0000
                    Date: Tue, 24 Sep 2019 14:17:40 GMT
                    Host: 127.0.0.1:8000
                    X-Debug-Token: 9b7443
                    X-Debug-Token-Link: http://127.0.0.1:8000/_profiler/9b7443
                    X-Powered-By: PHP/7.2.10
                    X-Robots-Tag: noindex


                    Donc je pense que l'info passe bien à la requête. Et je ne comprends pas car quand je passe la même requête en local, j'ai les bonnes infos.

                    Du coup, je ne sais pas où chercher....

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 septembre 2019 à 16:43:57

                      Donc c'est un souci de gestion de la réponse, j'imagine. Que contient ta variable javaScript xmlDocimmédiatement après l'avoir créée ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 septembre 2019 à 10:51:39

                        Le résultat retourné en par mon js, mon xmlDoc n'est pas bon.

                        Pour l'id Loueur 68 il aurait du retourner seulement 4

                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 septembre 2019 à 12:47:32

                          Pour le fait d'avoir 4 au lieu de 6, c'est la requête Doctrine qui est en cause. Je maintiens que cette histoire de NOT IN ( une date ) me paraît étrange (parce que d'une part on n'a pas besoin de IN pour une seule valeur, <> irait tout aussi bien, et d'autre part tu veux quand-même les données pour cette date, et pas vraiment celles pour les dates autour), mais bon.

                          Sinon, c'est ça le problème mentionné huit messages auparavant ?

                          -
                          Edité par Ymox 25 septembre 2019 à 12:49:39

                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 septembre 2019 à 14:10:41

                            En fait, j'y vais par étape, car à terme il faut que j'enlève les locations entre la date de début et la date de fin.

                            Je me suis dis que ca serait plus facile si j'y allait step by step. 

                            D'après mes recherches il faudra faire un between dateDebutLoc et dateFinLoc.

                            Je me suis basée sur la doc de doctrine pour faire mes recherches. Je n'ai pas trouvé le <>. Par contre je me souviens l'avoir testé dans mes recherches pour faire ma requête en SQL et ca ne m'avait pas donné ce que je voulais.

                            Ce que je ne comprends pas c'est pourquoi ma requête Doctrine ne fonctionne pas qd je l'a passe depuis mon formulaire et qu'elle me renvoit ce qu'il faut quand je met l'adresse directe sur mon navigateur.

                            Quand tu parles de 8 messages auparavant tu fais allusion au paramètre optionnel ? Car ca c'est modifié

                             public function allLoueursXml(LoueurRepository $repo, $dateDebutLoc = '') {



                            -
                            Edité par ElodieMartin13 25 septembre 2019 à 14:14:27

                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 septembre 2019 à 15:18:00

                              Non, je parlais de la date qui n'était pas prise en compte par ta requête, sachant que ça pouvait venir de plusieurs endroits.

                              Il nous faut encore voir si le contrôleur la reçoit correctement, et pour ça, rien de tel qu'un exit(dump($dateDebutLoc)) juste après la signature de ton action.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 septembre 2019 à 17:44:08

                                Je l'ai ecris comme ca dans le controlleur. C bon ?

                                 /**
                                     * @Route("/loc_dial/allLoueursXml/{dateDebutLoc}", name="all_loueurs_xml")
                                     * @param Date $dateDebutLoc
                                     */
                                    public function allLoueursXml(LoueurRepository $repo, $dateDebutLoc = '') {
                                        
                                        $balises = $repo->findAllDialDispoByLoueur ($dateDebutLoc);
                                
                                        exit(dump($dateDebutLoc));


                                Je seul moyen que j'ai trouvé pour le lire c'est de mettre le lien dans le navigateur mais du coup on ne voit pas si le controleur le reçoit bien...

                                Voici la réponse :

                                2019-09-18
                                LocController.php on line 86:
                                "2019-09-18"



                                -
                                Edité par ElodieMartin13 26 septembre 2019 à 10:03:21

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 septembre 2019 à 13:16:06

                                  Idéalement, tu pouvais mettre la ligne 9 avant la 7, mais bon. Au moins, on sait que le contrôleur récupère bel et bien la date (mais sous forme de chaîne de caractères), et donc que c'est la requête qui est en cause, et donc je ne comprends pas comment tu peux avoir des résultats OK dans certains cas et pas d'autres, sauf si résultats corrects sont avec des dates qui n'ont aucune location…

                                  Ajoute le type \DateTimeInterface au paramètre $dateDebutLoc, et change la valeur par défaut à null

                                  -
                                  Edité par Ymox 26 septembre 2019 à 13:16:37

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 septembre 2019 à 14:58:02

                                    Rooooo mais comme tu es trop fort !!!! Ca fonctionne !!!!

                                    Pourrais-tu me dire quelle est la différence entre le type Date et DateTimeInterface ?

                                    Maintenant la dernière étape est de faire la date de fin, pour enlever toutes les balises louées entre la date de début et la date de fin.

                                    Le mieux est-ce de faire une requête dans locationRepository et de récupérer l'id des balises puis dans LoueurRepository de faire un notIn de cette liste ?

                                    Ou est-ce que à la place de notIn je fais un

                                    WHERE ('dateDebutLoc' < $dateDebutLoc AND 'dateFinLoc' > $dateFinLoc)

                                    ORWHERE ('dateDebutLoc' > $dateFinLoc AND 'dateFinLoc' < $dateDebutLoc) ?

                                    Mais dans ce cas je crois qu'il me dit qu'il lui faut un objet et que moi je renvoie un boolean.

                                    Bref, je n'ai réussi à faire fonctionner aucune de ces 2 solutions .... Lol !!!

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 septembre 2019 à 15:18:20

                                      Le mieux est-ce de faire une requête dans locationRepository et de récupérer l'id des balises puis dans LoueurRepository de faire un notIn de cette liste ?

                                      Non, le mieux serait plutôt d'utiliser le bon critère dans la requête. Quelque chose comme

                                      $qb->expr()->not($qb->expr()->between(':dateDebutLoc', $debutDebut, $debutFin))

                                      Pourrais-tu me dire quelle est la différence entre le type Date et DateTimeInterface ?

                                      Le "type Date" est un type de données Doctrine et in extenso SQL.
                                      DateTimeInterface est, comme le nom l'indique, une interface qui est implémentée pour l'instant par les objets DateTime et DateTimeImmutable, et contient aussi les constantes de formats notamment.

                                      -
                                      Edité par Ymox 26 septembre 2019 à 15:48:51

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        26 septembre 2019 à 15:56:50

                                        ce qui donnerait ceci comme requête alors :

                                         $query = $this->createQueryBuilder('lou'); 
                                                $query  -> select('PARTIAL lou.{id, nom, cp, ville, latitude, longitude}')
                                                        -> addSelect($query->expr()->count('bal.id') . ' AS nb_balises')
                                                        -> leftJoin('lou.balise', 'bal')
                                                        -> leftJoin('bal.locations', 'loc')
                                                        -> where($query->expr()->eq('bal.fonctionnel', $query->expr()->literal(true)))
                                                        -> andWhere($query->expr()->orX(
                                                            $query->expr()->not($query->expr()->between(':dateDebutLoc', $dateDebutLoc, $dateFinLoc)),
                                                            $query->expr()->not($query->expr()->between(':dateFinLoc', $dateDebutLoc, $dateFinLoc)),
                                                            $query->expr()->isNull('loc.dateDebutLoc')
                                                        ))
                                                        -> groupBy('lou.id')
                                                        -> setParameter ('dateDebutLoc', $dateDebutLoc)
                                                        -> setParameter ('dateFinLoc', $dateDebutLoc);
                                                $results = $query -> getQuery() -> getResult();


                                        La requête ne beug pas mais n'enlève pas les balises louées.

                                        Je viens de me rendre compte qu'il y a un autre point que je n'ai pas pris en compte c'est le nombre de balise louée par location. Comment dois-je faire pour prendre en compte ce paramètre ?

                                        -
                                        Edité par ElodieMartin13 26 septembre 2019 à 16:09:34

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          26 septembre 2019 à 16:23:25

                                          Au temps pour moi.

                                          $qb->expr()->not($qb->expr()->between(':dateDebutLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc'))
                                          $qb->expr()->not($qb->expr()->between(':dateFinLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc'))
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            27 septembre 2019 à 9:56:45

                                            J'ai l'impression qu'il ne prend pas la date de fin car il n'enlève toujours qu'une seule balise

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              27 septembre 2019 à 10:17:23

                                              Ah, mais en fait, ces deux contraintes doivent être respectées, et pas juste une des deux.

                                              $query->expr()->orX(
                                                  $query->expr()->andX(
                                                      $query->expr()->not($query->expr()->between(':dateDebutLoc', $dateDebutLoc, $dateFinLoc)),
                                                      $query->expr()->not($query->expr()->between(':dateFinLoc', $dateDebutLoc, $dateFinLoc))
                                                  ),
                                                  $query->expr()->isNull('loc.dateDebutLoc')
                                              ))
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                27 septembre 2019 à 10:28:34

                                                Yes ! Cool ! Trop fort ! Merci !

                                                Et il y a une autre contrainte c'est qu'une location peut correspondre à plusieurs balises. Par exemple dans ma base de données j'ai une location le 22/09 mais elle concerne 2 balises, du coup il faut retirer 2 balises et non pas une.

                                                Comment je gère cela ?

                                                -
                                                Edité par ElodieMartin13 27 septembre 2019 à 11:22:42

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  27 septembre 2019 à 16:45:30

                                                  Hé ben, heureusement que j'ai attendu avant de te répondre, vu qu'apparemment ça fonctionne quand même.

                                                  Normalement, on ne prend que les balises qui n'ont pas de location. Au vu des jointures, qu'une location concerne une ou plusieurs balises ne change rien à ce niveau, vu que plusieurs balises sont liées à la même location.

                                                  Si vraiment ça posait problème, on déplacerait les critères sur la jointure au lieu de les avoir sur la requête globale.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    27 septembre 2019 à 17:02:31

                                                    Je suis d'accord avec toi, j'avais vu les choses de la meme facon.

                                                    Sauf que lorsque je met une location du 22 au 25/09 avec 2 balises de louées le 22 et 2 louées le 25, il ne m'en enlève qu'une seule pour la date du 22 et une pour la date du 25.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      27 septembre 2019 à 23:38:55

                                                      Heu, en fait, j'ai écrit une grosse bêtise dans le dernier code avec le andX(), je ne sais pas si tu l'as corrigé par toi-même. J'ai mis des variables en deuxième et troisième paramètres, alors qu'il faudrait les champs de la table quelque part, quand-même  :honte:

                                                      $query->expr()->orX(
                                                          $query->expr()->andX(
                                                              $query->expr()->not($query->expr()->between(':dateDebutLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc')),
                                                              $query->expr()->not($query->expr()->between(':dateFinLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc'))
                                                          ),
                                                          $query->expr()->isNull('loc.dateDebutLoc')
                                                      ))

                                                      Tu pourrais me remontrer ta méthode de repository actuelle ?

                                                      -
                                                      Edité par Ymox 27 septembre 2019 à 23:39:20

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        29 septembre 2019 à 8:16:08

                                                        Oui Oui je l'avais changé.... ;)

                                                        Voici mon loueurRepository

                                                           public function findAllDispoByLoueur ($dateDebutLoc, $dateFinLoc) {
                                                                
                                                                $query = $this->createQueryBuilder('lou'); 
                                                                $query  -> select('PARTIAL lou.{id, nom, cp, ville, latitude, longitude}')
                                                                        -> addSelect($query->expr()->count('bal.id') . ' AS nb_balises')
                                                                        -> leftJoin('lou.baliseDial', 'bal')
                                                                        -> leftJoin('bal.locations', 'loc')
                                                                        -> where($query->expr()->eq('bal.fonctionnel', $query->expr()->literal(true)))
                                                                        -> andWhere($query->expr()->orX(
                                                                            $query->expr()->andX(
                                                                                $query->expr()->not($query->expr()->between(':dateDebutLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc')),
                                                                                $query->expr()->not($query->expr()->between(':dateFinLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc'))
                                                                            ),
                                                                            $query->expr()->isNull('loc.dateDebutLoc')
                                                                        ))
                                                                        -> groupBy('lou.id')
                                                                        -> setParameter ('dateDebutLoc', $dateDebutLoc)
                                                                        -> setParameter ('dateFinLoc', $dateFinLoc);
                                                                $results = $query -> getQuery() -> getResult();
                                                               
                                                                 // returns an array of Product objects
                                                                return $results;
                                                            }
                                                        



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

                                                          OK, je voulais m'en assurer.

                                                          ElodieMArtin13 a écrit;

                                                          Sauf que lorsque je met une location du 22 au 25/09 avec 2 balises de louées le 22 et 2 louées le 25, il ne m'en enlève qu'une seule pour la date du 22 et une pour la date du 25.

                                                          Et cela survient quand tu mets quelles valeurs pour les paramètres :dateDebutLoc et dateFinLoc ?

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            30 septembre 2019 à 14:47:46

                                                            Quand je mette du 22 au 22/09 il m'en enlève 1 au lieu de 2.

                                                            Et quand je met du 22 au 25/09 il m'en enlève 2 au lieu de 4

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              30 septembre 2019 à 16:56:27

                                                              J'ai toujours le même jeu de données que celles que tu nous avais fournies précédemment, j'ai juste ajouté une location pour deux balises (les 4 et 13) par le loueur 4. J'ai adapté la requête pour voir les IDs des locations et des balises qui seraient sélectionnées. Quand je lance la requête avec les paramètres 2019-09-22 pour les début et fin, j'ai les résultats suivants :

                                                              5 	null 	2, 30, 9, 46, 23
                                                              5 	2, 3 	27, 50, 20, 6, 43
                                                              3 	null 	8, 45, 1
                                                              5 	null 	28, 7, 44, 14, 51
                                                              4 	null 	19, 12, 26, 5
                                                              4 	null 	24, 3, 10, 47
                                                              5 	null 	18, 11, 48, 25, 32

                                                              J'ai bien l'impression que les locations 1 et 4, qui sont à exclure, ne sont pas prises en compte, pas plus que les balises 4 et 13 qui sont propres à la location 4.

                                                              • 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