Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête Php sous symfony4

Sujet résolu
    1 octobre 2019 à 10:38:47

    Salut Ymox,

    La base de données que je t'ai donné n'était pas exacte, j'ai associé qu'une seule balise à la location. Il faut donc dans la "table location_balise_d***" rattaché une autre balise pour chaque location.

    Le loueur 4 n'avait aucune balise assignée, tu en a détaché d'un autre loueur.  Parce que dans ma base j'avais 7 loueurs et il y a 7 lignes .

    La nouvelle location que tu as créée avait pour id 4 ? tu lui as assigné 2 balises en date du 22/09 ?

    En date du 22/09 moi j'ai le loueur 18 avec id de location 1 et 2 balises de louées la 17 plus une autre que tu n'as pas. 

    Sachant qu'il y a 42 balises, il devrait y en avoir 38 de dispo. Tu me suis jusque là ? Or si je comprends bien ta requête, il m'en sors 31.

    Il manque la 4, 13, 15, 16, 17, 21, 22, 29, 41, 42, 49

    Pour le 4, 13 et 17 c'est normal. Et les autres ?

    • Partager sur Facebook
    • Partager sur Twitter
      1 octobre 2019 à 13:34:29

      ElodieMartin13 a écrit:

      Le loueur 4 n'avait aucune balise assignée, tu en a détaché d'un autre loueur.

      Non, j'ai vraiment fait comme dit dans mon message précédent, soit concrètement une insertion dans la table des locations et deux insertions dans la table de jointure vers les balises. Par contre, je n'ai effectivement pas fait attention que le loueur ne possédait pas de balise.

      ElodieMartin13 a écrit:

      La nouvelle location que tu as créée avait pour id 4 ? tu lui as assigné 2 balises en date du 22/09 ?

      Oui et oui.

      Pour le reste, on n'a manifestement pas le même jeu de données, c'est impossible de comparer ainsi, le seul point de départ de comparaison aurait été ces données d'exemple fournies précédemment.

      J'aimerais juste être certain d'avoir bien compris : si je disais que ton besoin est d'« afficher le nombre de balises non louées (libres) par possesseur pendant une période définie » — je mets volontairement "possesseur" pour tenter qu'on ne fasse pas la confusion du fait qu'un objet Loueur est à la fois le possesseur d'une balise et le locataire d'autres —, est-ce que je suis juste ?

      • Partager sur Facebook
      • Partager sur Twitter
        1 octobre 2019 à 14:26:36

        Si tu entends pas période définie hors date mise dans la requete, oui tu as bien compris mon besoin.
        • Partager sur Facebook
        • Partager sur Twitter
          1 octobre 2019 à 14:46:44

          Ah, alors attends, parce que justement je n'ai pas forcément compris juste. Je reformule donc : « afficher le nombre de balises non louées (libres) par possesseur en dehors d'une période définie ».

          C'est plus clair et correct ainsi ?

          -
          Edité par Ymox 1 octobre 2019 à 14:49:51

          • Partager sur Facebook
          • Partager sur Twitter
            1 octobre 2019 à 15:51:58

            Non du tout. Je vais essayer de te donner un example ca sera peut etre plus facile a comprendre.

            Imagine que tu souhaites louer un velo du 05/10 au matin  au 06/10 aprem. Quand tu vas faire ta location, pour pouvoir te proposer différents lieux ou il y a des velos disponible, le systeme a besoin de connaitre le nombre de velos dispo par lieu. Il faut qu'il enleve par exemple le velo qui n'est loué que le 05/10 aprem, celui qui est loué du 06/10 aprem au 07/10 matin.

            Est-ce plus clair ?

            • Partager sur Facebook
            • Partager sur Twitter
              1 octobre 2019 à 16:41:27

              OK, pour moi ça rejoint ce que j'ai dit deux messages avant.

              Si, avec la contrainte sur les dates :

              • on enlève les négations
              • on la déplace dans la jointure
              • mais on garde bien la contrainte IS NULL là où elle est

              Comment ça se passe ?

              • Partager sur Facebook
              • Partager sur Twitter
                2 octobre 2019 à 9:43:29

                Euh...

                Comment tu intègres :

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

                dans :

                leftJoin('bal.locations', 'loc')

                ?


                • Partager sur Facebook
                • Partager sur Twitter
                  2 octobre 2019 à 10:13:19

                  Regarde les lignes 12 à 17 du dernier pavé de code de ce message  ^^
                  A noter que, maintenant que je le relis, il y avait l'information pour résoudre ton problème dès ce message…

                  Les méthodes pour faire des jointures prennent plusieurs paramètres, le dernier étant une condition à ajouter pour la jointure à effectuer — je dis bien à ajouter, parce que la condition sur l'ID étranger est automatiquement présent.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 octobre 2019 à 11:07:45

                    Bon alors voici ma requête : 

                      $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',
                                                \Doctrine\ORM\Query\Expr\Join::WITH,
                                                $query->expr()->orX(
                                                    $query->expr()->andX(
                                                        $query->expr()->between(':dateDebutLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc'),
                                                        $query->expr()->between(':dateFinLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc')
                                                    )))
                    
                                    -> where($query->expr()->eq('bal.fonctionnel', $query->expr()->literal(true)))
                                    -> andWhere($query->expr()->isNull('loc.dateDebutLoc'))
                                    -> groupBy('lou.id')
                                    -> setParameter ('dateDebutLoc', $dateDebutLoc)
                                    -> setParameter ('dateFinLoc', $dateFinLoc);
                            $results = $query -> getQuery() -> getResult();

                    Du coup, la quantité retirée est bonne cette fois-ci mais ca fonctionne seulement lorsque la date de debut et de fin est identique.

                    Si je met une location du 22/09 au 25/09, il ne me retire rien du tout.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 octobre 2019 à 13:36:35

                      Le orX est désormais inutile étant donné qu'il n'a qu'un argument. Il était présent parce qu'on voulait soit pas de location, soit aucune qui soit dans les dates.

                      Pour ce qui est de la requête, je te propose d'ouvrir un sujet dans le forum "Bases de données". Il faudra une explication claire de ce que tu attends, probablement un jeu de test ainsi qu'un ou deux exemples de ce que tu attends avec ce jeu de données. On reviendra ici pour l'écriture avec le QueryBuilder si besoin.

                      Si tu peux aussi leur mettre la requête avec les résultats qu'elle sort pour tes deux exemples et que tu relèves les différences, tu auras toutes les chances pour que quelqu'un de plus qualifié que moi trouve ce qui ne va pas.

                      SELECT
                      		loueur.id,
                      		count(balise.id) AS nb_balises,
                      		group_concat(location.id ORDER BY location.id SEPARATOR ', ') AS locations,
                      		group_concat(balise.id ORDER BY balise.id SEPARATOR ', ') AS balisess
                      	FROM
                      				loueur
                      		LEFT JOIN
                      				balise
                      			ON
                      					loueur.id = balise.loueur_id
                      		LEFT JOIN
                      				location_balise
                      			ON
                      					balise.id = location_balise.balise_id
                      		LEFT JOIN
                      				location
                      			ON
                      					location_balise.location_id = location.id
                      				AND	:dateDebutLoc BETWEEN location.date_debut_loc AND location.date_fin_loc
                      				AND	:dateFinLoc BETWEEN location.date_debut_loc AND location.date_fin_loc
                      	WHERE
                      			balise.fonctionnel = true
                      		AND	location.date_debut_loc IS NULL
                      	GROUP BY
                      		loueur.id

                      Réponds ici en mettant le lien vers ce nouveau sujet, ça m'intéresse.

                      -
                      Edité par Ymox 2 octobre 2019 à 13:37:35

                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 octobre 2019 à 14:49:49

                        Lien vers le sujet sur le forum BDD : ICI
                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 octobre 2019 à 16:43:22

                          OK, donc si je me base sur le code présenté plus haut et que je prends en compte ce message, en fait au lieu de supprimer le orX qui était en trop, il aurait fallu supprimer le andX.

                          J'avais oublié ça de la loi de De Morgan  :honte:

                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 octobre 2019 à 16:54:32

                            EDIT : Ok c'était encore une erreur de ma part dans la création des locations de test ! Je plaide coupable !

                            Tout fonctionne nickel !

                            -
                            Edité par ElodieMartin13 2 octobre 2019 à 19:39:19

                            • Partager sur Facebook
                            • Partager sur Twitter
                              3 octobre 2019 à 9:09:33

                              Je te conseille d'implémenter la version "simplifiée" des conditions de jointure comme proposé dans ce message.

                              Et si ton souci est bien résolu, utilise le bouton sur les deux sujets pour le signaler  :)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                3 octobre 2019 à 11:29:51

                                Ben non, il n'est pas vraiment résolu au final, car je n'ai plus d'erreur mais les données ne sont pas en base de données malheureusement !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  3 octobre 2019 à 13:18:20

                                  Heu, on ne parlait que de récupérer des données, si le souci est désormais de les enregistrer, je crois que c'est ton autre sujet, non ? Du moment que c'est un autre problème et qu'il a son propre sujet, pourquoi ne pas mettre celui-ci en résolu ?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    3 octobre 2019 à 14:00:08

                                    Exact la requête c'est bon !
                                    • 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