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

Doctrine2 PHP Discussion :

Clé primaire composée de clé étrangère


Sujet :

Doctrine2 PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Clé primaire composée de clé étrangère
    Bonjour,

    Je réalise une application web avec Symfony 2 à partir d'une base de données existante.

    Je dois mettre en place une entité ayant une clé primaire composée de 2 clés étrangères.

    Exemple :

    Entite1 avec une clé primaire composée : propriete1 (PK), propriete2 (PK)
    Entite2 avec clé primaire composée des 2 clé étrangères : propriete1 (PK FK), propriete2 (PK FK), propriete3 (PK)

    Je ne sais pas comment mettre en place l'association :

    Dans l'entité 2 je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
    * @ORM\ManyToOne(targetEntity="Entite1")
    * @ORM\JoinColumns({
    * @ORM\JoinColumn(name="propriete1", referencedColumnName="propriete1"),
    * @ORM\JoinColumn(name="propriete2", referencedColumnName="propriete2")
    *@ORM\Id
    * })
    */
     
    private $entite1;
    Mais j'obtiens une erreur :

    It is not possible to map entity
    ExempleBundle\Entity\Entite1' with a composite primary key as part of the primary key of another entity 'ExempleBundle\Entity\Entite2#entite1
    Comment gérer proprement ce genre d’association avec Doctrine

    J'ai essayé de suivre cette exemple mais j'ai pas bien compris : http://docs.doctrine-project.org/pro...mic-attributes

    Pouvez-vous donner un exemple sur 2 entités avec un cas similaire et surtout sur comment faire une jointure dans ce cas là.

    Merci par avance.

    Birzat


    Est ce que Doctrine gère ce genre de relation ?

  2. #2
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Un petit up

  3. #3
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 417
    Points : 826
    Points
    826
    Par défaut
    Bonjour,
    Je ne sais pas si ce sera très utile mais voici un petit retour d'expérience :
    Pour ma propre application, j'avais fait des tests concernant les PK composées.
    Il ressort que, dans les cas maître-datail-détail avec descente de clés, Doctrine s'emmêle les pinceaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # test Du Maître-Détail-Détail
    M1 ----< D1 -------< DD1
    - id     - M1_id     - M1_D1_id
             - id        - D1_id
                         - id
     
    # D1  : La PK est composée de la PK de M1 et d'un identifiant complémentaire
    # DD1 : La PK est composée de la PK de D1 et d'un identifiant complémentaire
     
    => Erreur
     [Doctrine\ORM\Mapping\MappingException]
      It is not possible to map entity 'Fd1' with a composite primary key as part of the primary key of another entity 'Fdd1#fd1Fm1'.
    Pour être clair, dès qu'on a des PKs composées de FKs en provenance de PKs elles mêmes composées, Doctrine ne sait pas générer les entités... Et c'est bloquant.

    Pour ma part, j'aime mieux utiliser les descente Pks car sinon, je trouve que les requêtes multi-tables peuvent être singulièrement compliquées dès que l'on a plus de 1 niveau de descente (parfois, on ne passe pas par une application pour interroger les bases).
    Qui plus est, Lorsqu'on souhaite gérer les identifiants soi-même, Doctrine n'est pas très collaboratif.

    Compte tenu de la taille de notre application, nous avons considéré que la meilleure option était de générer les entités en désactivant les clés étrangères au niveau de la base.
    Ainsi, toute cette génération se passe bien.
    Une fois les entités générées, on régénère les FKs de la base.
    La contrepartie, c'est que nous avons dû faire nous même un générateur de code (en python, je préfère) qui va chercher les informations relatives aux FKs dans l'"information_shema" de la base (mysql pour nous) pour faire tous les get nécessaires pour récupérer les entités liées.

    Pour conclure, nous sommes plutôt satisfaits de la solution que nous avons retenu. Elle nous laisse une grande latitude d'action puisque nous maîtrisons très finement la gestion des clés étrangères. De plus, notre générateur de code, basé sur des templates twig, a été ensuite utilisé pour générer des contrôleurs, de la documentation... Il a donc été très largement rentabilisé :-)

    my 2 pence.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/04/2010, 13h36
  2. Clé étrangère à partir d'une clé primaire composée
    Par Deciprog dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/04/2010, 23h11
  3. Réponses: 1
    Dernier message: 21/10/2009, 16h26
  4. Clé primaire composées de plusieurs clés étrangères
    Par 2berte dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 10/02/2009, 16h56
  5. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38

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