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

PHP & Base de données Discussion :

[Doctrine] plusieurs many-to-many avec une seule table


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Lideln75
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 111
    Par défaut [Doctrine] plusieurs many-to-many avec une seule table
    Bonsoir,

    J'ai une table "Employee" et une table "Options". La table "Options" définit une liste d'options pour différents champs concernant l'employé. Par exemple le champ "studies", à valeur unique, pourra prendre une valeur parmi toutes celles dans "Options" qui ont pour type = "studies".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Employee
    id
    name
    service
    position
    studies
     
    Options
    id
    type ("studies", "position", "service", "competence", "project", ...)
    name
    En plus de ça, mon employé a plusieurs "champs" (entre guillemets) qui peuvent avoir des valeurs multiples, genre "competences", "projects" (et d'autres champs).

    Donc j'ai créé une table de jointure "employee_options" qui définit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    employee_id
    option_id
    type ("competences", "projects", etc.)
    Ce que j'aimerais, c'est avoir une relation nommée "Competences" qui lie à un employé une série de valeurs dans la table "employee_options" dont le type vaut "competences", et pouvoir avoir une autre relation nommée par exemple "Projects" qui lie à un employé une série de valeurs dans la table "employee_options" dont le type vaut "projects".

    Donc en gros il me faudrait une clef étrangère (que j'ai : employee_id), mais aussi une seconde contrainte sur la valeur du champ "type"...

    Est-ce faisable ?

  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
    Le plus simple est d'utiliser une des particularités de doctrine appelée : Héritage par agrégation de colonne (inheritage by Column Aggregation)

    Ton schéma devient :
    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
     
    employee:
      columns:
        name: string(100)
        service_id: integer
        position_id: integer
        studie_id: integer
      relations:
        studie:
          local: studie_id
          foreign: id
          foreignAlias: employees
        service:
          local: service_id
          foreign: id
          foreignAlias: employees
        position:
          local: position_id
          foreign: id
          foreignAlias: employees
     
    option:
      columns:
        name: string(100)
     
    studie:
        inheritance:
          extends: option
          type: column_aggregation
          keyField: type
          keyValue: 1
     
    service
        inheritance:
          extends: option
          type: column_aggregation
          keyField: type
          keyValue: 2
     
    position:
        inheritance:
          extends: option
          type: column_aggregation
          keyField: type
          keyValue: 3
    Note la disparition des champs id qui, s'il n'y a pas de primaryKey définie seront créé automatiquement.

    Tout est passé en minuscule.

    Pas de "s" sauf si, dans une relation, il y a un retour de plusieurs enregistrements. (dans employee, le retour des positions et autres options).

    La table option comporte trois champs, id (créé automatiquement), name, type (créé par les column aggregation).

    Il n'y a pas de tables : position, studie,... mais des objets pour y accéder, il n'est donc jamais nécessaire d'utiliser la valeur du champ type dans une requête.

    Les id des tables : position, studie,... sont le même champ, il n'est donc pas possible d'avoir une position et une studie avec le même champ id.

    Pour récupérer les positions d'un objet emplyee ($employee), il convient de faire un $employee->getPosition() et on va récupérer la position de cet employee. Au contraire, pour récupérer la liste des employés pour une position ($position) : $position->getEmployees() le "s" va indiquer qu'il y a, en retour, un Doctrine_Collection des employés qui occupent cette position. Attention, suivant la requête sous-jacente, cela peut générer beaucoup de requêtes.

Discussions similaires

  1. Gestion des libellés avec une seule table
    Par scharly3 dans le forum Microsoft BI
    Réponses: 7
    Dernier message: 02/03/2012, 22h41
  2. B.D avec une seule table
    Par infose dans le forum Développement
    Réponses: 7
    Dernier message: 04/11/2010, 10h58
  3. [SSAS] Cube avec une seule table
    Par Safaritn dans le forum SSAS
    Réponses: 3
    Dernier message: 01/08/2008, 15h05
  4. Merge mais avec une seule table : possible?
    Par kissskoool dans le forum SQL
    Réponses: 10
    Dernier message: 10/03/2008, 13h53
  5. [FN]Faire 1 BD avec une seule table ou normaliser ?
    Par borndead dans le forum Schéma
    Réponses: 7
    Dernier message: 12/06/2007, 15h26

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