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 :

Relation Many to Many et colonnes dans la table association


Sujet :

Symfony PHP

  1. #1
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Par défaut Relation Many to Many et colonnes dans la table association
    Bonjour,

    J'explique, j'ai des relations N..N avec des colonnes dans les tables associations et j'aimerai savoir comment gérer ce cas. J'ai lu par-ci par-là que c'était plutôt compliqué ?

    J'ai essayé embedForm et embedRelation mais le résultat n'est pas probant. Dans un cas, j'ai rien qui s'affiche, dans l'autre seulement la colonne de la table association.

  2. #2
    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
    Es-tu sure de ton shema.yml ? Une erreur dedans et tous tes essais tomberont à l'eau.

    Tu as deux possibilités. Soit tu veux juste avoir des listes d'un ou des deux côtés pour dire qui est en relation avec qui, tu as un widget qui permet de gérer ce type de relations facilement.

    Si tu veux faire de l'édition tu as un plugin qui permet de gérer correctement les embed, regarde dans la salle plugin, dans le sujet épinglé.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Par défaut
    Mes relations ne sont définis que d'un côté et dans la table association j'ai deux relations 1-N, enfin un schéma vaut mieux que des explications :

    La table association avec une donnée, c'est cette donnée que je veux pouvoir gérer quand j'ajoute un champs dans cette table à partir du formulaire d'une personne :
    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
    PersonActivity:
      connection: doctrine
      tableName: person_activity
      columns:
        person_id:
          type: integer
          primary: true
        activity_id:
          type: integer
          primary: true
        special_status:
          type: enum(18)
          values:
            - Coordinator
            - 'Deputy Coordinator'
            - 'Task Leader'
            - 'Science Manager'
            - 'Technical Manager'
            - Expert
      relations:
        Person:
          class: sfGuardUserProfile
          local: person_id
          foreign: id
          onDelete: CASCADE
        Activity:
          local: activity_id
          foreign: id
          onDelete: CASCADE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sfGuardUserProfile:
      actAs:
        Timestampable: ~
      columns:
    ...
      relations:
    ...
        Activities:
          class: Activity
          local: person_id
          foreign: activity_id
          refClass: PersonActivity
          foreignAlias: Persons
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Activity:
      connection: doctrine
      tableName: activity
      columns:
        id:
          type: integer
          primary: true
          autoincrement: true
    ...
      relations:
    ...
    J'ai regardé un peu le README du plugin ahDoctrineEasyEmbeddedRelations mais il montre un exemple de relation 1-N, ca fonctionne avec les relations N-N?

  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
    Pour ce qui est des morceaux de schéma, quelques réflexions à la volée :
    • Toutes les relations devraient avoir un paramètre foreignAlias. D'autre indiqués sont les valeurs par défaut, pas nécessaire, mais ne nuisent pas.
    • Dans un lien qui fait référence pont pour une relation n-n il ne faut pas utiliser 'local' et 'foreign' (je sais, on le trouve dans la doc, pourtant l'expérience prouve que cela met le bordel).
    • Attention aux liaisons n-n avec des attributs, doctrine les gères mal. Il est souvent préférable de les considérer comme deux liaisons 1-n et n-1
    • Il faut éviter les champs de type enum, lourd à gérer et lourd à maintenir. Un champ de type integer et un tableau défini dans le modèle permettent la même facilité pour stocker les données et un bon usage des widget et validator select. De plus, rajouter une option n'implique pas une modification de structure de la base.


    Pour le plugin, il ne gère que les 1-n. Il permet donc de lier des enregistrements avec leur attribut et le vis-à-vis. Je ne vois pas trop comment tu pourrais gérer plus sur un écran.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Par défaut
    Merci pour tes conseils. Je vais compléter/modifier mon schéma, juste une remarque, dans mon cas, la clé dans la table association est person_id alors que le nom de la table avec le refClass est sfGuardUserProfile, si je lui indique pas au moins local, il retrouve la bonne clé ou je dois modifier ma clé dans la table association ?

    Pour mettre en place les deux relations 1-n 1-n, je dois simplement supprimer la relation n-n non ?
    Et ensuite, j'utilise le plugin pour lié les relations dans les formulaires ?

  6. #6
    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
    Dans le cas d'une relation n-n et du lien directe entre les deux tables, il utilise les liens déclaré sur la table de relation pour récupérer les enregistrement, table déclarée avec refClass. Dans ce cas "local" n'a pas d'intérêt.

    En règle général, il va pouvoir remplir automatiquement "local" en fonction du modèle. Ce que tu décris pour ta liaison est une exception qui va obliger à saisir "local" dans le shema.yml. Pour la relation depuis la table de liaison, pas pour le raccourci entre les deux tables n-n.

    Si tu utilises le raccourci entre les deux tables n-n, les propriétés du liens ne sont pas accessibles. Dans certains cas, cela peut être pratique, il faut alors garder cette liaison de raccourci, dans d'autre cas, c'est un danger, il faut alors supprimer ce lien. A toi de voir suivant ton application et l'utilisation de tes données.

    Pour le formulaire, il faudrait savoir ce que tu veux y mettre et comment.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Par défaut
    Ce que j'aimerai faire c'est quand un utilisateur rempli son profil (classe sfGuardUserProfile), il puisse renseigner une activité et précisé la valeur du champ special_status. Par exemple, j'ai dix activités. Quand un utilisateur va remplir sont profil, il va se retrouver avec une liste de checkbox d'activité et à côté de chaque checkbox un sélecteur de special_status.
    J'imagine bien que c'est assez compliqué de trouver ça par "défaut" mais si quelques choses s'en rapproche je suis preneur. Sinon, j’essaierai de faire "à la main".

  8. #8
    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
    L'utilisateur remplit son statut pour une activité.

    Questions :
    Doit-il remplir son statut pour toutes les activités ?

    Peut-il créer une nouvelle activité depuis cet écran ?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Par défaut
    Il coche une activité, il choisi le statut pour celle-la, il en coche une autre elle choisit son statut pour celle-la. Donc un statut par activité.
    Non il ne peut pas créer de nouvelles activités de son formulaire.

  10. #10
    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
    Dans ce cas là, ton formulaire ne gère pas une relation n-n, mais une relation 1-n. Soit la relation entre la personne et la liste de ces activités. Qu'une activité soit elle même un choix dans une liste n'influe pas.

    Vu que tu n'as pas le problème de la création d'une activité à la volée, je pense que le plugin devrait faire un bon travail.

  11. #11
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Par défaut
    Une suite de problème se pose :
    D'abord j'essai de d'utilsier le plugin donc je vais ça dans sfGuardUserProfileForm.class.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class sfGuardUserProfileForm extends PluginsfGuardUserProfileForm
    {
      public function configure()
      {
          parent::configure();
     
          $this->embedRelations(array(
              'PersonActivities' => array(
                  'considerNewFormEmptyFields' => array('activity_id', 'special_status'),
              )
          ));
      }
    }
    Puis j'affiche le formulaire et il n'y a que special_status qui s'affiche, donc je vais voir dans BasePersonActivityForm.class.php et là je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'activity_id'    => new sfWidgetFormInputHidden(),
    donc je me dis, c'est normal qu'il ne s'affiche pas donc je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class PersonActivityForm extends BasePersonActivityForm
    {
      public function configure()
      {
          parent::configure();
     
          $this->setWidget('activity_id', new sfWidgetFormDoctrineChoice(array(
              'model' => 'Activity'
          )));
      }
    }
    Mais toujours rien qui s'affiche. Donc je crée un module avec la classe PersonActivity et là quand j'essai d'éditer un champ j'ai le choix de l'activité qui s'affiche mais je ne peux pas sauvegarder (normal à mon avis à cause du validateur)

  12. #12
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Par défaut
    Je cherche si possible un exemple de formulaire qui gère les doubles relations 1..N parce que je n'y arrive toujours pas.

Discussions similaires

  1. PGSQL-EclipseLink Relation One To Many et Many To One
    Par faitor1 dans le forum Persistance des données
    Réponses: 0
    Dernier message: 30/01/2015, 20h46
  2. [2.x] Relation many-to-many se pointant elle-même dans un schema YAML
    Par Crusider dans le forum Symfony
    Réponses: 1
    Dernier message: 12/06/2014, 15h37
  3. Réponses: 3
    Dernier message: 29/12/2010, 09h55
  4. Données d'une table deviennent colonne dans autre table?
    Par christophe1245 dans le forum Access
    Réponses: 8
    Dernier message: 19/12/2005, 23h01
  5. Ajout d'une colonne dans une table ...
    Par Djedjeridoo dans le forum SQL
    Réponses: 2
    Dernier message: 22/07/2003, 17h12

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