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

Plugins PHP Discussion :

Jointure sans relation de clef étrangère


Sujet :

Plugins PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Par défaut Jointure sans relation de clef étrangère
    Bonjour,

    Avec Doctrine (sous symfony) je souhaite faire une jointure via un champ commun sur 2 tables pour lesquelles il n'y a pas de foreign key. Mais j'ai des soucis.

    Erreur de doctrine
    "Unknown relation alias sfGuardUserGroup"

    Schéma de ma BDD (en YML)
    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
     
    Personnel:
      columns:
        login:                 { type: string(6), primary: true   }
        id_sf_guard_user:      { type: integer(4) }
        id_equipe:             { type: string(3), fixed: true }
        nom:                   { type: string(20), notnull: true  }
        prenom:                { type: string(20), notnull: true  }
      relations:
        EquipePersonnel:            { class: Equipe, local: id_equipe, foreign: id_equipe, onUpdate: CASCADE, onDelete: CASCADE }
        sfGuardUser:                { class: sfGuardUser, local: id_sf_guard_user, foreign: id,  onUpdate: CASCADE, onDelete: CASCADE }
     
    Equipe:
      columns:
        id_equipe:             { type: string(3), fixed: true, primary: true }
        id_groupe_cpa:          { type: integer(4) }
       relations:
         GroupeCPA:             { class: sfGuardGroup, local: id_groupe_cpa, foreign: id,  onUpdate: CASCADE, onDelete: CASCADE }
     
    sfGuardGroup:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true }
        name:         { type: string(255), unique: true }
      relations:
        users:        { class: sfGuardUser,  refClass: sfGuardUserGroup,  local: group_id,      foreign: user_id, foreignAlias: Groups }
     
    sfGuardUser:
      columns:
        id:                 { type: integer(4), primary: true, autoincrement: true }
        username:           { type: string(128), notnull: true, unique: true }
      relations:
        groups:             { class: sfGuardGroup, local: user_id, foreign: group_id, refClass: sfGuardUserGroup, foreignAlias: Users }
     
    sfGuardUserGroup:
      columns:
        user_id:           { type: integer(4), primary: true }
        group_id:          { type: integer(4), primary: true }
      relations:
        sfGuardUser:       { local: user_id, onDelete: CASCADE }
        sfGuardGroup:      { local: group_id, onDelete: CASCADE }
    Ma Requête de jointure (dotrine)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $q = Doctrine_Query::create()
    	->from('Personnel p')
    	->innerJoin('p.sfGuardUserGroup s 
    		ON p.id_sf_guard_user = s.user_id')
    	->where('s.group_id = ?', $this->getIdGroupeCpa())
    	->orderBy('pers.login ASC');
    Ma requête sous PostgreSQL (qui affiche très bien le résultat voulu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM personnel pers
    INNER Join sf_guard_user_group s
    ON pers.id_sf_guard_user = s.user_id
    where s.group_id = 2
    Questions : est-il possible de faire des jointures avec des champs qui n'ont pas de relations FK ? Que pourrait être mon erreur ? Comment pourrais je faire ce que je souhaite ?

    Merci de m'aider

    Ophélie

  2. #2
    Membre expérimenté Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Par défaut
    Salut.

    Regarde à la fin de cet article : http://troll-me.fr/dql-doctrine-query-language/

    Tu trouvera un exemple de requête croisée. Normalement, il n'y a pas de notion de contrainte des cette requête.

  3. #3
    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
    J'ai rapatrié la discutions dans la salle plugin de symfony qui me semble plus adaptée.

    L'erreur vient du fait que tu utilises une relation qui n'existe pas dans ton modèle.
    ->innerJoin('p.sfGuardUserGroup s ...
    fait référence à une relation qui s'appelerait sfGuardUserGroup du côté de la table personnel, mais qui n'existe pas dans ton schéma.

    Je comprend ta requêtes, mais je ne suis pas sur que tu prennes le meilleur chemin. A ta place, et même si la requête résultante est moins optimisée, je partirais sur les liaisons existante, entre ta table "Personnel" et sfGuardUser puis avec la relation entre sfGuardUser et sfGuardGroupe.

    Ce qui va garantir un fonctionnement plus sur sans trop handicaper les performances.

    Accessoirement, je pense que tu aurais intérêt à modifier ton schema et utiliser l'héritage pour que ta table "Personnel" hérite de la table sfGuardUser, ce qui te permettrait de n'avoir, en fait, qu'une table avec deux vues au niveau du modèle. Et donc, une liaison directe et automatique vers le groupe. Du moins si ton projet n'est pas déjà trop avancé.

Discussions similaires

  1. [AC-2003] Export fichier XML sans clefs primaires et clefs étrangères
    Par Alicedoesnotcare dans le forum Access
    Réponses: 0
    Dernier message: 13/03/2014, 15h02
  2. Réponses: 4
    Dernier message: 06/02/2012, 09h55
  3. [MySQL] [Doctrine] Jointure sans relation
    Par Cladjidane dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/09/2009, 06h41
  4. [wamp5] [Relations] Clefs étrangéres
    Par nebule dans le forum Outils
    Réponses: 6
    Dernier message: 05/10/2004, 11h17
  5. [SQL SERVER 2000] Problème clef étrangére
    Par Tankian dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/05/2004, 10h44

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