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

PHP & Base de données Discussion :

[Doctrine] 2 relations vers la même table


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 71
    Points : 83
    Points
    83
    Par défaut [Doctrine] 2 relations vers la même table
    Bonjour à tous !

    Je découvre actuellement symfony, et je suis bluffé par ces capacités ... Mais cependant, il me reste un probléme que je n'arrive pas à élucider.

    J'ai sur mon mcd 2 relations pointant vers la meme table, du genre :

    Profil (id, nom, prenom)
    Commentaire(id, commentaire, #id_du_commenté, #id_du_commenteur)

    #id_du_commenté et #id_du_commenteur faisant tout 2 référence à id de la table profil.

    Doctrine arrive trés bien à generer la BDD pour prendre cela en compte, mais cela se corse quand j'essaie d'ajouter des données.

    Je me retrouve en effet dans mon .yml avec la forme suivante :

    Commentaire:
    Commentaire1
    Profil: profil1
    Profil: profil2
    commentaire: Yes !

    Et doctrine ne différencie pas les 2 "Profils".

    Quelqu'un connait une solution ?

    Merci d'avance !

  2. #2
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    j'aurais fais çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // tables principales
    Profil(id, nom, prenom)
    Commentaire(id, commentaire)
    
    // tables de liaison
    ProfilCommente(id_commentaire, id_profil)
    ACommente(id_commentaire, id_prodil)

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Bonjour à tous,

    moi j'ai un soucis dans le même genre. Pour faire simple il s'agit d'un site de vente du type ebay.
    J'ai donc trois tables (parmis tant d'autres), la table Objet (qui décrit une annonce), la table User qui décrit un utilisateur et la table Achete qui fait la relation entre un utilisateur, une annonce et un montant d'enchere max.

    J'ai besoin qu'il y ait plusieurs relations entre les tables Objet et User :
    La table Objet contient un champ gagnant et un champ vendeur avec deux relations vers l'id utilisateur et la table Objet a une troisième relation vers la table User à travers la table Achete.

    Comment puis-je créer deux relations vers une même table dans mon yml ?

    Si je fais comme ça :
    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
    User: 
     actAs: 
      Timestampable: ~
     columns: 
      pseudo: { type: string(12), unique: true }
      mdp: { type: string(20), notnull: true }
    [ ... ]
     relations: 
      Objet: { refClass: Achete, local: user_id, foreign: objet_id }
    
    Objet: 
     actAs: 
      Timestampable: ~
     columns: 
      titre_objet: { type: string(50), notnull: true }
      description: { type: clob }
    [ ... ]
      vendeur_id: { type: integer, notnull: true }
      gagnant_id: { type: integer }
     relations: 
      User: { onDelete: CASCADE, local: vendeur_id, foreign: id }
      User: { onDelete: CASCADE, local: gagnant_id, foreign: id }
      User: { refClass: Achete, local: objet_id, foreign: user_id } 
    
    Achete: 
     actAs: { Timestampable: ~ }
     columns: 
      user_id: { type: integer, primary: true }
      objet_id: { type: integer, primary: true }
      prix: { type: integer(11), notnull: true }
    En gras les 3 relation vers la même table User. Bien évidement ça ne fonctionne pas, il prend en compte que la dernière.

    J'ai beau cherché je ne trouve pas...

    Merci

  4. #4
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    Je répondrais de la même façon qu'au premier post. Je créerai d'autres tables. Décomposer c'est simplifier (sans en abuser...).

    Par exemple, au lieu de mettre vendeur_id dans objet, je créerais une table Vente (id_objet, id_vendeur, ...)

    Et ainsi de suite.

    Pour finir, sais-tu que si tu utilises les conventions de nommages, tu n'as pas besoin de déclarer explicitement toutes ces relations ? Ton YAML pourrait être beaucoup plus simple, doctrine retrouve ces relations...

    En espérant t'avoir aidé

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Oui je pense pouvoir m'en sortir en décomposant et en créant de nouvelle tables...

    Que veux tu dire par conventions de nommages ?
    Je veux bien un lien vers de la doc si tu as j'ai du mal a trouver des trucs sérieux...

  6. #6
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    C'est simple. Par exemple, tu as :

    Membre (id, login, pass...)
    Post (id, membre_id...)

    En nommant membre_id, doctrine comprend que c'est une relation vers la table membre, champ id. C'est un exemple ^^.

    abbreviated-syntax

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Je dois avoir mal compris car j'ai bien l'impression que ça ne fonctionne pas chez moi.

    Dans la table User j'ai un champ region_id qui doit donc être en relation avec la table Region.

    Voici mes bouts de code :

    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
    User: 
     actAs: 
      Timestampable: ~
     columns: 
      pseudo: { type: string(12), unique: true }
      mdp: { type: string(20), notnull: true }
    [ ... ]
      region_id: { type: integer, notnull: true }
     relations: 
      Region: { onDelete: CASCADE, local: region_id, foreign: id }
    
    Region: 
     columns: 
      libelle_region: { type: string(30), notnull: true, unique: true }
    D'après toi la relation devrait se faire automatiquement même si j'enlève la ligne en gras dans le code ? Ca ne fonctionne pas chez moi...

    Je dois oublier quelque chose.

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    J'ai parlé trop vite. Il ne faut pas oublier la ligne
    Merci pour ces infos !

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Bon j'ai essayé d'applique la detection auto des relations, mais cela revient au même que de les déclarer soit même, c'est à dire que si vous avez plusieurs relations vers la même table seule la dernière est prise en compte.

    Y a t-il un moyen de déclarer plusieurs relations vers une même table ?

    Comme ça (mais autrement pour que ça marche ^^) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     relations: 
      User: { onDelete: CASCADE, local: vendeur_id, foreign: id }
      User: { onDelete: CASCADE, local: gagnant_id, foreign: id }
      User: { refClass: Achete, local: objet_id, foreign: user_id }

  10. #10
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    cela revient au même que de les déclarer soit même, c'est à dire que si vous avez plusieurs relations vers la même table seule la dernière est prise en compte.
    Donc il est très probable que tu doives créer d'autres tables : Vente, Achat... qui mettent en relation un objet et un user.

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Tout d'abord merci pour ta ponctualité !

    Mais même après pas mal de réflexion je n'arrive pas à comprendre comment je vais pouvoir m'en sortie.

    Si je met une table ventre et une table achat qui mettent en relation un user et un objet, de devrais bien déclarer ces relations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     relations: 
      User: { refClass: Vente, local: objet_id, foreign: user_id } 
      User: { refClass: Achete, local: objet_id, foreign: user_id }
    Du coup j'aurai le même problème, seulement la dernière relation vers User est prise en compte...

  12. #12
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    J'ai trouvé la réponse sur le forum :
    http://www.developpez.net/forums/d76...tion-multiple/

  13. #13
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    C'est bon à savoir. Juste une question de syntaxe alors, fallait le trouver quand même. C'est tellement courant que je me demande pourquoi c'est pas surligner en rouge dans leur documentation

Discussions similaires

  1. Deux jointures vers la même table ?
    Par JYFJYF dans le forum Requêtes
    Réponses: 9
    Dernier message: 27/01/2010, 16h02
  2. Réponses: 0
    Dernier message: 23/07/2009, 15h45
  3. Plusieurs jonctions vers la même table
    Par Leduc08 dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/11/2008, 09h32
  4. copie d'une ligne d'une table access vers le méme table
    Par FST_PFE dans le forum VBA Access
    Réponses: 4
    Dernier message: 31/10/2008, 10h23
  5. Relation dans une même table
    Par Ylias dans le forum JPA
    Réponses: 5
    Dernier message: 29/05/2008, 10h36

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