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 :

Doctrine v~2.2 | manyToMany avec attributs supplémentaires


Sujet :

Symfony PHP

  1. #1
    Membre régulier Avatar de foolib
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 90
    Points
    90
    Par défaut Doctrine v~2.2 | manyToMany avec attributs supplémentaires
    Bonjour,

    pour me mettre à Symfony2 j'ai commencé une petite application de gestion de réservation d'appartements.

    En bref, un utilisateur peut être rattaché à plusieurs appartements et vice versa.
    La relation "user" / "estate" est de type n:n et implique donc une table de jointure.

    J'ai construit ma base de donnée avec PHPMyAdmin et ai entre autres ces trois tables:
    - "user" et "estate" dont chacune a comme clef primaire un entier en autoincrément
    - "estateUser" avec comme clef primaire la composition deux clefs étrangères "idUser" et "idAppart".

    J'ai commencé par envisager une relation "manyToMany" dans le schema yaml ..
    Seulement j'avais besoin d'ajouter plusieurs champs supplémentaires dans ma table de liaison.

    J'ai pu lire que lorsque une relation manyToMany nécessite ne serait-ce qu'un champ supplémentaire, il ne s'agit plus vraiment d'une relation manyToMany et la table de jointure doit être modélisée comme une entité à part entière.
    La relation est scindée en 4 relations:

    1- oneToMany user => estateUser
    2- oneToMany estate=> estateUser
    ---
    3- manyToOne estateUser => user
    4- manyToOne estateUser => estate


    Je ne suis pas parvenu à générer le yaml avec les outils de Doctrine en ligne de commande pour obtenir cette troisième entité
    J'ai essayé notemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app/console doctrine:mapping:convert yml ./src/AppBundle/Ressources/config/doctrine --from-database --force
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app/console doctrine:mapping:import AppBundle yml
    Doctrine considère systématiquement la relation comme une "manyToMany" et ne créé donc pas de fichier estateUser.orm.yml

    En recherchant un peu, je suis tombé sur cet article de la documentation:
    Dans l'exemple il n'y a que le code décoré d'annotations, et pas la version YAML.



    Je souhaite donc pouvoir générer les fichiers de schéma depuis la base.
    Ou si ce n'est pas possible à cause de la nature de la relation, juste savoir que mettre dans les fichiers yml pour chacunes des 3 entités, en conservant le principe de clef primaire combinée avec les 2 clefs étrangères pour l'entité "estateUser".
    Et enfin pouvoir générer mes classes d'entités et leurs classes de reporitory.


    Voici mon ébauche des fichiers schema yml à la main:
    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
     
    Estate:
        type: entity
        table: estate
        id:
            id:
                type: integer
                nullable: false
                unsigned: false
                id: true
                generator:
                    strategy: IDENTITY
        fields:
            label:
                type: string
                nullable: false
                length: 30
                fixed: false
        oneToMany:
            features:
                targetEntity: Estateuser
                mappedBy: estate
        lifecycleCallbacks: {  }
    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
     
    User:
        type: entity
        table: user
        id:
            id:
                type: integer
                nullable: false
                unsigned: false
                id: true
                generator:
                    strategy: IDENTITY
        fields:
            name:
                type: string
                nullable: false
                length: 70
                fixed: false
            lastname:
                type: string
                nullable: false
                length: 70
                fixed: false
            password:
                type: string
                nullable: false
                length: 70
                fixed: false
            email:
                type: string
                nullable: false
                length: 70
                fixed: false
            created:
                type: datetime
                nullable: false
            modified:
                type: datetime
                nullable: false
            deleted:
                type: datetime
                nullable: true
        oneToMany:
          oneToMany:
            features:
              targetEntity: Estateuser
              mappedBy: users
        lifecycleCallbacks: {  }
    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
     
    Estateuser:
        type: entity
        table: estateUser
        id:
            idUser:
                associationKey: true
            idEstate:
                associationKey: true
     
        manyToOne:
            users:
                targetEntity: User
                joinColumn:
                    name: idUser
                    referencedColumnName: id
        manyToOne:
            estates:
                targetEntity: Estate
                joinColumn:
                    name: idEstate
                    referencedColumnName: id


    Je sèche et ça commence à être chronophage .. Quelqu'un sairait-il m'aider ?
    Un coup de main serait vraiment appréciable, merci d'avance !

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Je souhaite donc pouvoir générer les fichiers de schéma depuis la base.
    => À éviter. On génère la base depuis les entités et non l'inverse.

    Tu n'as que deux relations à faire : la relation entre User et UserEstate, et la relation entre Estate et UserEstate.
    Ce sont bien des relations ManyToOne, et éventuellement OneToMany si tu veux que ces relations soient bidirectionnelles.

    Par contre j'aurais mis le Many est du coté des entités, le One du coté de l'entité intermédiaire. J'ai le sentiment que tu fais l'inverse.

Discussions similaires

  1. [2.x] Formulaire relation ManyToMany avec attributs
    Par Trezegoals dans le forum Symfony
    Réponses: 0
    Dernier message: 08/08/2012, 16h00
  2. [2.x] ManyToMany avec attribut, erreur à la création d'une entité
    Par Warnershoot dans le forum Symfony
    Réponses: 5
    Dernier message: 19/06/2012, 14h01
  3. Relation ManyToMany avec attribut
    Par icl1c dans le forum Doctrine2
    Réponses: 0
    Dernier message: 09/03/2012, 11h44
  4. [TinyMCE] links / img avec attributs supplémentaires
    Par BlindeKinder dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 17/05/2011, 18h19
  5. Réponses: 8
    Dernier message: 27/02/2009, 01h37

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