Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 17h53   #1
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
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.
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 20h58   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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é.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 09h19   #3
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
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 :
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 :
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 :
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?
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 10h32   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 10h44   #5
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
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 ?
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 14h24   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 14h36   #7
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
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".
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 17h40   #8
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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 ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 17h45   #9
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
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.
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 12h40   #10
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 14h44   #11
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
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 :
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 :
'activity_id'    => new sfWidgetFormInputHidden(),
donc je me dis, c'est normal qu'il ne s'affiche pas donc je fais ça :
Code :
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)
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 10h26   #12
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
Je cherche si possible un exemple de formulaire qui gère les doubles relations 1..N parce que je n'y arrive toujours pas.
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h42.


 
 
 
 
Partenaires

Hébergement Web