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

ORM PHP Discussion :

Problème avec plusieurs associations (rôles) avec une table unique


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut Problème avec plusieurs associations (rôles) avec une table unique
    Bonjour à tous,

    Je viens de me lancer dans un nouveau projet qui présente pour moi une nouveauté.

    Une de mes tables (Ressource) possède plusieurs relations n-n vers une deuxième table (Individu).
    Chacun de ces relations représente un rôle particulier de l'individu par rapport à la ressource. J'ai autant de tables d'association que de relations, et je les ai nommées par le nom du rôle qu'elles représente (Auteur, Contributeur, Contact).
    Je "pointe" toutes ces associations vers la table Individu car bien souvent une instance d'Individu peut aussi bien être Auteur, Contributeur et/ou Contact.

    Le schéma YML ci-dessous me semblait correct ainsi que les fixatures. A la création de la base et à l'importation du jeu de données, je n'ai eu aucun problème. J'ai vérifié la base générée via phpmyadmin et ça m'a semblé correct.

    Le problème c'est lorsque, dans un template par exemple, j'écris un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $ressource->getAuteurs();
    J'obtiens alors une belle erreur 500 avec comme message :
    500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
    Unknown record property / related component "Auteurs" on "Ressource"
    J'ai eu le premier réflexe d'aller voir la classe BaseRessource, et la méthode ::getAuteurs() a bien été générée.

    Je n'ai ce problème qu'avec ce type de relations. Les relations n-n avec un seul rôle (une seule association) ne posent pas ce problème.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Ressource:
      tableName:  ressource
      actAs:
        Timestampable:  ~
        SoftDelete:   ~
        UserTraceable: ~
        Sluggable:
          fields:       [nom]
          unique:       true
      columns:
     
      # La liste des champs étant longue et inutile ici, je vous l'épargne
     
      relations:
         Contributeurs:
           foreignAlias:  Ressources
           class: Individu
           refClass:  Contributeur
         Auteurs:
           foreignAlias:  Ressources
           class: Individu
           refClass:  Auteur
         Contacts:
           foreignAlias:  Ressources
           class: Individu
           refClass: Contact
     
     
     
    Auteur:
      tableName:  auteur
      actAs:
        Timestampable:  ~
        UserTraceable: ~
        SoftDelete:   ~
      columns:
        ressource_id:
          type:     integer
          primary:  true
        individu_id:
          type:     integer
          primary:  true
      relations:
        Ressource:
          onDelete: CASCADE
          foreignAlias: Auteurs
        Individu:
          onDelete: CASCADE
          foreignAlias: Auteurs
     
     
    Individu:
      tableName:  individu
      actAs:
        Timestampable:  ~
        UserTraceable: ~
        SoftDelete:   ~
        Sluggable:
          fields:   [nom]
          unique:   true
      columns:
        nom:
          type:     string(50)
          notnull:  true
        prenom:
          type:     string(50)
        fonction:
          type:     string(20)
        email:
          type:     string(255)
        telephone:
          type:     string(10)
        fax:
          type:     string(10)
    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
    Ressource:
        nom:              "Formation développement durable"
        Themes:           [theme08]
        SousThemes:       [sstheme01]
        duree:            14
        Localisation:     Localisation03
        public_cible:     Formateurs et acteurs Distance Zéro
        descriptif:       "Présentation du développement durable (historique, concept), enjeux et stratégies, applications au quotidien"
        Tags:             [Tag03,Tag04]
        objectif:         "Eveiller les consciences individuelles et prendre en compte le développement durable dans la vie privée et professionnelle"
        Auteurs:     [Individu01, Individu02]
        Contributeurs:       [Individu03]
        Contacts:      [Individu02]
        ModalitesPedagogiques: [Modalite02]
        is_eligible:      true
        Contact:          Individu11
        Niveau:           Niveau02
     
    Individu:
      Individu01:
        nom:    *****
        prenom: *****
      Individu02:
        nom:    *****
        prenom: *****
      Individu03:
        nom:    *****
        prenom: *****
    Je ne sait pas vraiment d'où vient ce problème, et je voudrais déjà savoir si mon schéma est bon pour ce genre de relations, avant de chercher le problème ailleurs.

    Merci d'avance !

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    En regardant rapidement ton schema, il y a un point qui me semble suspect dans les alias :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Ressource:
      relations:
         Auteurs:
           foreignAlias:  Ressources
           class: Individu # (1) 
           refClass:  Auteur
          
    Auteur:
      relations:
        Ressource: 
          onDelete: CASCADE
          foreignAlias: Auteurs  # (2)
    Sauf erreur de ma part :

    (1) : $ressource->getAuteurs() renvoie une liste d'Individus
    (2) : $ressource->getAuteurs() renvoie une liste d'Auteurs (instance de la table d'association)

    Pas sûr que Doctrine aime ce genre d'ambiguïtés.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Ah oui en effet, ça ne m'avait pas sauté aux yeux.

    Je regarde de suite...

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Non apparemment ça ne règle pas le problème.

    J'ai changé le foreignAlias de la table d'association en 'AssoAuteurs'.

    $ressource->getAuteurs() renvoie toujours la même erreur, bien que la classe ait été générée par Doctrine comme c'est indiqué dans la classe de base.

    $ressource->getAssoAuteurs() fonctionne bien et me retourne la collection d'associations.

    A partir de là je pourrais me débrouiller avec getAssoAuteurs() et recréer une fonction équivalentes à getAuteurs() mais ce serait dommage. J'aimerai bien comprendre pourquoi ça ne fonctionne pas...

  5. #5
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Je viens de faire un test rapide, ça a tout l'air d'un bug symfony (ou doctrine...).

    [snip... non rien, j'ai cru trouver quelque chose pour contourner mais ça ne marche toujours pas.]

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    ok merci Hérode, je commençais aussi sérieusement à penser au bug symfony/doctrine.

    Donc je vais recréer ces méthodes a la mano...

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/08/2010, 07h29
  2. Réponses: 0
    Dernier message: 23/07/2009, 15h45
  3. Réponses: 10
    Dernier message: 26/03/2008, 15h00
  4. [SQL] Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/08/2006, 13h28
  5. Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/08/2006, 13h21

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