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

Symfony PHP Discussion :

left join non prévu dans le schema [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut left join non prévu dans le schema
    bonjour,

    j'ai 2 tables, la premiere me permet de grouper à la création un groupe de personnes la seconde de gerer par personne des données par date:
    Code : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    GrpeChqDejList:
      connection: doctrine
      tableName: GrpeChqDejList
      columns:
        grpechqdej_id:
          type: integer
        user_id:
          type: integer
          unique: true
      indexes:
        Unique:
          fields: [grpechqdej_id, user_id]
          type: unique
      relations:
        User:
          class: sfGuardUser
          local: user_id
          foreign: id
        GrpeChqDej:
          class: GrpeChqDej
          local: grpechqdej_id
          foreign: id    
     
    ChqDej:
      connection: doctrine
      tableName: cheqdej
      columns:
        user_id: 
          type: integer
        date:
          type: timestamp
        conges:
          type: integer
        maladie:
          type: integer
        professionel:
          type: integer
        nbChq:
          type: integer
      indexes:
        Unique1:
          fields: [user_id, date]
          type: unique
      relations:
        User:
          class: sfGuardUser
          local: user_id
          foreign: id
          onDelete: CASCADE
          onUpdate: CASCADE
    je ne désire pas avoir une relation forte entre ces deux tables mais j'ai besoin davoir un affichage par groupe donc en SQL ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT G.`user_id`, MAX(c.date )
    FROM GrpeChqDejList G 
    LEFT OUTER JOIN cheqdej c ON c.user_id=G.user_id 
    WHERE G.`grpechqdej_id`=1 
    GROUP BY G.`user_id`
    que j'ai transcrit en doctrine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $q = Doctrine_Query::create()
          	    ->select('a.user_id,MAX(c.date)')
          		->from('GrpeChqDejList a')
          		->leftJoin('cheqdej c ON a.user_id = c.userid')
          		->where('a.grpechqdej_id = ?',$id)
          		->execute();
    malheureusement j'ai le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Couldn't find class cheqdej
    quelle est la bonne syntaxe ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Tu n'as effectivement pas de classe : cheqdej
    Mais une classe : ChqDej.

    De manière plus générale, je te conseillerais d'être beaucoup plus vigilant dans tes nommages de classe, table, paramètres, etc.

    D'une part, la lecture d'un nom doit être le plus explicite possible. En n'utilisant que des abréviations, j'ai dû prendre le temps de décoder tes noms pour comprendre ce qu'ils représentaient (ce qui est une mauvaise chose).

    D'autre part, tu es constamment obligé de venir vérifier la bonne orthographe pour être sûr, lorsque tu utilises un nom autre part dans ton code, de ne pas te tromper dans la manière de l'écrire.

    Certes, écrire "ChequeDejeuner" est plus long. Mais :
    1. tu comprends beaucoup plus rapidement de quoi il s'agit ;
    2. tu évites de te tromper entre cheqdej et ChqDej !

    Après, peut-être as-tu aussi une erreur sur la manière dont est écrite la requête elle-même. Mais j'ai toujours du mal à écrire moi-même mes left join

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    effectivement c'était ça.
    je n'avait pas compris qu'il faut mettre la classe et non la table dans le leftJoin

    pour le nommage, vais essayer de faire des effort
    merci

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Si le shéma est correctement conçu (je n'ai pas vérifié le tiens) dans le leftjoin de doctrine tu ne mets ni le nom de la classe ni le nom de la table mais le nom de la relation (ou le nom défini par foreignAlias qui est le nom de la relation vu de l'autre côté de la relation.

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    j'ai pas de relation entre ces 2 tables dans mon schema, pour des raisons pratiques.

    Bon par contre en faites ça ne marche toujours pas, si je n'ai pas de message d'erreur il ne me prend pas en compte ma liaison:
    mon schéma doctrine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $q = Doctrine_Query::create()
          	    ->select('a.user_id, DATE(MAX(c.date)) AS maxdate')
          		->from('GrpeChqDejList a')
          		->leftJoin('ChqDej c ON a.user_id = c.userid')
          		->groupBy('a.user_id')
          		->where('a.grpechqdej_id = ?',$id)
          		->execute();
    et la requête SQL qui est généré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT g.id AS g__id, g.user_id AS g__user_id, DATE(MAX(c.date)) AS c__0 FROM GrpeChqDejList g, cheqdej c WHERE (g.grpechqdej_id = ?) GROUP BY g.user_id - (1)
    EDIT: j'ai comme un doute, il y a moyen de faire un leftJoin qui n'est pas prévu dans le schéma ??

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    bon apres une demi journée a fouiné sur internet:
    un leftjoin non prévu dans le schema ne fonctionne que si l'on a expressément indiqué les clés primaire de chacune des tables dans le select, c'est d'une logique...
    donc voici le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $q = $this->createQuery('a')
          	    ->select('a.id,c.id, a.user_id, DATE(MAX(c.date)) AS maxdate')
          		->leftJoin('a.ChqDej c ON a.user_id = c.user_id')
          		->groupBy('a.user_id')
          		->where('a.grpechqdej_id = ?',$id)      		
          		->execute();

  7. #7
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Citation Envoyé par erictomcat Voir le message
    j'ai pas de relation entre ces 2 tables dans mon schema, pour des raisons pratiques.

    Il me semble que cela soit justement moins pratique que de mettre simplement les relations.

    La méthode doctrine lsftJoint() est conçue pour fonctionner avec des relations déclarées dans le schéma, forcément, si tu ne veux pas les utiliser, elle va fonctionner beaucoup moins bien, je m'étonne même que tu arrives à établir une relation.

    Si non, tu as la possibilité "classique" de déclarer deux tables dans la méthode form et d'établir ta liaison à l'aide d'une méthode where() ou andWhere().

    Je reste convaincu que, hors exception exceptionnellement exceptionnel, toutes les relations ont intérêt à être définies dans le schéma de la base.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. évènement non prévu dans un petit programme
    Par flamant dans le forum C++
    Réponses: 3
    Dernier message: 18/01/2007, 21h56
  2. problème ave LEFT JOIN dans MySql
    Par lm0210 dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/05/2006, 19h46
  3. [Performance] LEFT JOIN vs SELECT dans une boucle (PHP)
    Par frochard dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/10/2005, 17h45
  4. count() dans *plusieurs* LEFT JOIN
    Par silver_dragoon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2004, 17h20
  5. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 21h25

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