IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

BDL - Symfony Request


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 300
    Points : 67
    Points
    67
    Par défaut BDL - Symfony Request
    Bonjour,
    Je fais du DQL sous Symfony 4.2
    J'ai la requête suivante, qui fonctionne:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        public function findEtudiantPasPointer($em, $idCours, $idDate, $idCreneau)
        {
          $query = $em->createQuery("
          SELECT u.nomUtilisateur, u.prenomUtilisateur, u.id AS ec_id
          FROM App\Entity\EtudiantCours ec
          LEFT JOIN App\Entity\Pointage po WITH ec.etudiant = po.utilisateurEtudiant
          JOIN App\Entity\Utilisateur u WITH po.utilisateurEtudiant = u.id
          JOIN App\Entity\CoursPlanning cp WITH po.cours = cp.id
          WHERE cp.cours = :idCours
          AND cp.plageHoraire = :idCreneau
          AND cp.dateCours = :idDate
          ")
          ->setParameter('idCours', $idCours)
          ->setParameter('idDate', $idDate)
          ->setParameter('idCreneau', $idCreneau);
     
          $result  = $query->getResult();
          return $result;
        }
    Elle me retourne 2 résultats.

    Je voudrai que cette requête me retourne la différence des entrées entre "EtudiantCours" et "Pointage".
    En claire, Pointage retrace les pointages des étudiants et "EtudiantCours" et retrace les élèves inscrits. Je veux savoir quels élèves inscrits n'ont pas pointé. Soit :
    Quels sont les id de la table ec.etudiant qui ne sont pas présent dans po.utilisateurEtudiant? Pourquoi mon LEFT JOIN ne suffit pas ? (un JOIN normal me donne le même résultat).
    Merci d'avance!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    Je ne connais pas DQL (j'ai au début cru à une faute de frappe, mais le with dans la jointure monte que non), mais visiblement ça fonctionne peu ou prou comme du SQL.
    Tu as mis une condition dans la clause WHERE sur la table PO, donc tu as implicitement transformé ta jointure externe en jointure interne.
    Il faut déplacer cette condition dans la jointure.

    Tatayo.

  3. #3
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 300
    Points : 67
    Points
    67
    Par défaut
    Hello!
    Oui tout à fait, le language est très similaire au SQL. Merci pour ta réponse, j'ai intégré la clause dans la jointure mais j'ai le même résultat pour le moment: j'ai les enregistrements des étudiants ayant pointé (po) et pas les enregistrement de ceux qui n'ont pas pointé (en gros "ec" moins "po", soit la différence des éléments présents sur "ec" et pas "po").
    J'ai tenté en adaptant mon code en SQL et en l'exécutant dans la console de PhpMyAdmin, j'ai le même résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          SELECT u.nom_utilisateur
          FROM etudiant_cours ec
          LEFT JOIN pointage po ON ec.etudiant = po.utilisateur_etudiant_id
          JOIN utilisateur u ON po.utilisateur_etudiant_id = u.id
          JOIN cours_planning cp ON po.cours_id = cp.id
          WHERE cp.cours = 63
          AND cp.plage_horaire_id = 75
          AND cp.date_cours = 1;
    J'ai utilisé ceci avec un exemple tiré de ma base, je suis censé avoir en retour 1 seul nom qui est dans "ec" mais pas dans "po", et à la place j'ai 2 noms, qui sont communs à ces 2 tables. une idée? merci
    PS: J'ai donc update mon post précédent avec les modifications. Travaillez avec la version que vous préférez si l'on corrige en SQL ça sera surement OK pour le DQL comme je trouve le même résultat.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Si j'ai bien compris (le confinement n'aide pas ), tu veux exclure du résultat les lignes pour lesquelles il n'y a pas de correspondance avec po.
    Dans ce cas il faut juste modifier le WHERE
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... and po.utilisateur_etudiant_id is null
    C'est dommage que tu ais modifié ton premier message, du coup on ne comprend plus ma réponse (on ne voit plus la condition dans le where).

    Tatayo.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Là encore, votre restriction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE cp.cours = 63
      AND cp.plage_horaire_id = 75
      AND cp.date_cours = 1;
    utilise des éléments de la table "cours_planning" qui est jointe à la table OUTER "pointage".
    Ce faisant, tout se passe comme si la jointure OUTER était une jointure INNER.

    Si vous voulez conserver une jointure OUTER et vérifier que l'étudiant de la table "etudiant_cours" est absent de la table "pointage" alors il faut utiliser une requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       SELECT u.nom_utilisateur
       FROM   etudiant_cours ec
       left JOIN pointage po 
         ON po.utilisateur_etudiant_id = ec.etudiant
       inner JOIN utilisateur u 
         ON u.id = po.utilisateur_etudiant_id
       inner JOIN cours_planning cp 
         ON cp.id = po.cours_id
        and cp.cours = 63
        and cp.plage_horaire_id = 75
        and cp.date_cours = 1
       where po.utilisateur_etudiant_id is null
       ;

  6. #6
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 300
    Points : 67
    Points
    67
    Par défaut
    Merci pour vos 2 réponses!
    J'avais tenté aussi un IS NULL, sans résultat. Ta requête semble bonne et compatible avec mes tables, mais le résultat est vide :
    Nom : 1.png
Affichages : 207
Taille : 13,6 Ko
    Voici les tables utilisées par ma requête:
    cours_planning:
    Nom : 2.png
Affichages : 217
Taille : 41,7 Ko
    etudiant_cours:
    Nom : 3.png
Affichages : 204
Taille : 24,0 Ko
    pointage:
    Nom : 4.png
Affichages : 200
Taille : 25,3 Ko
    Et enfin, la table utilisateur:
    Nom : 5.png
Affichages : 185
Taille : 15,5 Ko
    Si vous avez une idée, je suis preneur!
    Merci encore, je continue en parallèle à creuser ça

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    essayez avec cette syntaxe, souvent requise quand des combinaisons de jointure INNER et OUTER sont utilisées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       FROM   etudiant_cours ec         
       left JOIN pointage po 
           inner JOIN utilisateur u 
              on u.id = po.utilisateur_etudiant_id
           inner JOIN cours_planning cp 
              on cp.id = po.cours_id 
             and cp.cours = 63
             and cp.plage_horaire_id = 75
             and cp.date_cours = 1
         ON po.utilisateur_etudiant_id = ec.etudiant     -- critères de la jointure OUTER déportés ici 
       where po.utilisateur_etudiant_id is null
       ;

  8. #8
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 300
    Points : 67
    Points
    67
    Par défaut
    Merci pour ton retour!
    C'est top, la requête SQL fonctionne!
    Mon dernier soucis, est de convertir la requête en BQL.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
        {
          $query = $em->createQuery("
          SELECT u.nomUtilisateur, u.prenomUtilisateur, u.id AS userID
          FROM App\Entity\EtudiantCours ec
            LEFT JOIN App\Entity\Pointage po
              INNER JOIN App\Entity\Utilisateur u 
                WITH u.id = po.utilisateurEtudiant
              INNER JOIN App\Entity\CoursPlanning cp
                WITH cp.id = po.cours
                AND cp.cours = :idCours
                AND cp.plageHoraire = :idCreneau
                AND cp.dateCours = :idDate
            WITH po.utilisateurEtudiant = ec.etudiant
          WHERE po.utilisateurEtudiant is null
          ")
          ->setParameter('idCours', $idCours)
          ->setParameter('idDate', $idDate)
          ->setParameter('idCreneau', $idCreneau);
     
          $result  = $query->getResult();
          return $result;
        }
    J'ai une erreur sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WITH po.utilisateurEtudiant = ec.etudiant
    Nom : lklk.png
Affichages : 198
Taille : 10,5 Ko
    Si tu as une idée, je bloque. Merci d'avance

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    Je ne connais pas BQL, désolé, mais peut être que pour BQL, il faut remettre la syntaxe "classique" avec les critères de jointure juste après l'opérateur JOIN

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour

    essayez peut etre avec une sous requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ...
    FROM etudiant_cours ec         
       left JOIN (
            SELECT *
           FROM pointage po 
           inner JOIN utilisateur u 
              on u.id = po.utilisateur_etudiant_id
           inner JOIN cours_planning cp 
              on cp.id = po.cours_id 
             and cp.cours = 63
             and cp.plage_horaire_id = 75
             and cp.date_cours = 1) AS T
         ON T.utilisateur_etudiant_id = ec.etudiant
    à adapter peut etre pour eviter les doublons sur les noms de colonnes...

Discussions similaires

  1. [4.x] Symfony 4.3.3 Classe Request non trouvable
    Par ltatiekam dans le forum Symfony
    Réponses: 5
    Dernier message: 13/08/2019, 18h20
  2. [jsp]problème avec request.getParameter(...)!
    Par fadoua dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 01/09/2003, 13h26
  3. Envoyer un message icmp (Echo Request)
    Par ovdz dans le forum Développement
    Réponses: 5
    Dernier message: 19/06/2003, 14h14
  4. Request.RemoteAddr, Request.RemoteHost
    Par Pierre FORAZ dans le forum XMLRAD
    Réponses: 6
    Dernier message: 19/03/2003, 13h43
  5. [XMLRAD] Décoder Request.Query
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 8
    Dernier message: 10/01/2003, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo