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 :

Schéma pour une relation réflexive n-n


Sujet :

ORM PHP

  1. #1
    Membre éprouvé 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
    Points : 933
    Points
    933
    Par défaut Schéma pour une relation réflexive n-n
    Bonjour à tous,

    Soit un objet Catégorie, qui peut avoir 0-n catégories enfant, et 0-n catégories parent. J'ai tenté dans un premier temps de déclarer cette relation en utilisant refClass. Ce qui donne, en simplifié :

    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
     
    Category:
      columns: 
        name: { type: string(45) }
      relations: 
        Children:
          refClass: CategoryHasCategory
          foreign_id: parent_id
        Parents:
          refClass: CategoryHasCategory
          foreign_id: child_id
     
    CategoryHasCategory:
      columns: 
        parent_id: { type: integer, primary: true }
        child_id: { type: integer, primary: true }
      relations:
        ParentCategory:
          class: Category
          local: parent_id
        ChildCategory:
          class: Category
          local: child_id
    Quand je génère le modèle à partir de là, je m'attends à voir dans la classe BaseCategory des accesseurs get/setChildren() et get/setParents(). Mais ce n'est pas le cas. En revanche j'ai bien un get/setCategoryHasCategory() n-aire.

    Je peux sans doute me débrouiller avec ça pour faire mes formulaires d'administration (ou plutôt déclarer une relation n-n fictive sous forme de deux relations 1-n partant de latable d'association CategoryHasCategory.

    Mais avant cela, je voudrais être sûr de ne rien rater. N'y a t'il pas moyen de déclarer ce genre de relations réflexives comme les autres relations n-n ?

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Je pense que ton schéma pourrait être optimisé.

    Mais avant de passer 20 minutes à y travailler, pourquoi n'utilises tu pas la notion doctrine de Hiérarchie, notamment la : Multiple Trees ?

    Elle me semble plus adaptée pour ton cas.

  3. #3
    Membre éprouvé 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
    Points : 933
    Points
    933
    Par défaut
    Ha, voilà qui me semble intéressant. Merci pour l'info ! Je m'en vais éplucher cette doc de ce pas

    Sinon, par pure curiosité, je me demande comment tu optimiserais ce schéma ? Si tu as du temps à perdre, je suis aussi preneur de ces informations là - c'est le genre de détails qui peut faire progresser dans la compréhension des mécanismes, parfois.

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    En fait, ce que je t'ai envoyé hier soir ne fonctionnera pas, par le fait que tu souhaite la possibilité d'avoir plusieurs parents... C'est sur que le système n'a pas été conçu pour gérer des orgies de catégories

    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
     
    Category:
      columns: 
        name: { type: string(45) }
      relations: 
        Childrens:
          refClass: CategoryChild
          class: Category
          foreignAlias: Parents
     
    CategoryChild:
      columns: 
        parent_id: { type: integer, primary: true }
        child_id: { type: integer, primary: true }
      relations:
        ParentCategory:
          class: Category
          local: parent_id
          foreign: id
          foreignAlias: childs
        ChildCategory:
          class: Category
          local: child_id
          foreign: id
          foreignAlias: parents
    Pas testé, mais a mon avis, cela devrait marcher.

    En fait, il n'y a qu'une définition de refclass qui attaque deux fois la table elle même, et devrait générer deux méthodes sur la table category : ->getChildrens() et ->getParents()

    A tester et vérifier et valider ...

  5. #5
    Membre éprouvé 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
    Points : 933
    Points
    933
    Par défaut
    [edit: premier paragraphe viré ^^]

    J'ai examiné les NestedSets de Doctrine. Très intéressant en théorie et je pense que je pourrais simuler mon réseau avec des "multiple trees" en ajoutant une table, avec quelque chose sur le modèle :
    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
    Category:
      actAs:
        NestedSet:
          hasManyRoots: true
          rootColumnName: root_id
      columns:
        name:
          type: string(45)
          notnull: true
     
    CategoryOtherTree:
      actAs:
        NestedSet:
          hasManyRoots: true
          rootColumnName: root_id
      columns:
        category_id: integer
      relations:
        Category:
          foreignAlias: OtherTrees
    Cela permettrait de récupérer les comportements de NestedSet et les plugins qui vont avec pour les widgets et les validateurs. Cela m'éviterait d'avoir à gérer moi-même le calcul des 'level', je pourrais utiliser sfDoctrineTreePlugin, voire rendre optionnelle la vue en réseau et proposer une vue en arbre par défaut - il suffirait d'activer ou de désactiver la table annexe pour basculer d'un modèle à l'autre.

    (nb : en fait, je pense que cette idée de relations n-n pour les catégories, au lieu d'un 1-n classique - est discutable et ne servira pratiquement jamais sauf pour nous compliquer l'existence, le code et la maintenance, mais pas moyen de convaincre le décisionnaire ).

    Bref, l'idée du NestedSet est tout de même intéressante mais pour le moment, je n'arrive pas à faire marcher ça. Je soupçonne des erreurs dans la façon dont j'ai rédigé mes fixtures.yml. Enquête en cours...

Discussions similaires

  1. [MySQL] créer une table pour une relation réflexive
    Par PeaceMind dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/08/2012, 23h28
  2. Réponses: 3
    Dernier message: 25/06/2008, 15h21
  3. Réponses: 4
    Dernier message: 27/03/2008, 08h30
  4. Réponses: 2
    Dernier message: 07/08/2007, 09h51
  5. Problème de requête pour une relation de type n-n
    Par toutoune60 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2007, 15h41

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