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 :

Question sur les relations mon schéma


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 114
    Par défaut Question sur les relations mon schéma
    Bonjour à tous,

    Suite à un autre sujet que j'ai fait, je me suis aperçu que j'étais plutôt mal parti (merci mimi68), mieux vaut faire son schéma puis sa base que l'inverse (non ?), du coup, je suis allé en suivant l'exemple de Jobeet et la doc de Doctrine. J'obtiens ça (j'ai enlevé les champs inutiles) :

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    Categorie:
      columns:
        id:
          type: integer(4)
          primary: true
          autoincrement: true
        libelle:
          type: string(45)
      relations:
        Users:
          foreignAlias: Categories
          class: Site
          refClass: CategorieSite
    CategorieSite:
      columns:
        categorie_id:
          type: integer(4)
          primary: true
        site_id:
          type: integer(4)
          primary: true
        valeur:
          type: string(45)
      relations:
        Categorie:
          foreignAlias: CategorieSites
        Site:
          foreignAlias: CategorieSites
    Commentaire:
      actAs:
        Timestampable:
      columns:
        id:
          type: integer(4)
          primary: true
          autoincrement: true
        utilisateur_id:
          type: integer(4)
        site_id:
          type: integer(4)
        texte:
          type: string()
      relations:
        Utilisateur:
          foreignType: one
        Site:
          foreignType: one
    Parametre:
      columns:
        id:
          type: integer(4)
          primary: true
          autoincrement: true
        libelle:
          type: string(150)
      relations:
        Users:
          foreignAlias: Parametres
          class: Site
          refClass: ParametreSite
    ParametreSite:
      columns:
        parametre_id:
          type: integer(4)
          primary: true
        site_id:
          type: integer(4)
          primary: true
        valeur:
          type: string(45)
      relations:
        Parametre:
          foreignAlias: ParametreSites
        Site:
          foreignAlias: ParametreSites
    Site:
      actAs:
        Timestampable:
        I18n:
          fields: [titre, description]
      columns:
        id:
          type: integer(4)
          primary: true
          autoincrement: true
        utilisateur_id:
          type: integer(4)
        type_id:
          type: integer(4)
        titre:
          type: string(150)
      relations:
        User:
          foreignAlias: Sites
        Type:
          foreignAlias: Sites
    Type:
      columns:
        id:
          type: integer(4)
          primary: true
          autoincrement: true
        libelle:
          type: string(150)
      relations:
        Site:
          local: id
          foreign: type_id
          type: many
    Utilisateur:
      actAs:
        Timestampable:
      columns:
        id:
          type: integer(4)
          primary: true
          autoincrement: true
        email:
          type: string(254)
          notnull: true
      relations:
        Site:
          local: id
          foreign: utilisateur_id
          type: many
          onDelete: CASCADE
    Vote:
      actAs:
        Timestampable:
      columns:
        id:
          type: integer(4)
          primary: true
          autoincrement: true
        site_id:
          type: integer(4)
        utilisateur_id:
          type: integer(4)
        note:
          type: integer(4)
      relations:
        Utilisateur:
          foreignType: one
        Site:
          foreignType: one
    J'aurai juste aimé que quelqu'un y jette un coup d'oeil car je ne suis absolument pas sur de mes relations.

    Merci

  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
    J'ai jeté un œil, quelques remarques :

    Supprime toutes les déclaration des champs Id en integer(4) pour laisser doctrine faire ces propres déclaration d'Id en integer(8), ce qui simplifie le schéma .

    Changé l'organisation des tables (pour me permettre de mieux comprendre).

    Bizarrement la liaison n-n avec un argument dans la table de liaison semble fonctionner, ce que je n'était pas arrivé à faire passer. Là, cela semble marcher correctement, mais je n'ai pas fais de fixture pour tester.

    La table site est i18n ready, mais pas les tables catégorie, commentaire (mais là, je peux comprendre, quoique, il faudra étudier des solutions), Parametre, ParametreSite, Type.

    Je ne comprend pas la liaison entre categorie <- categorieSite -> site. En effet, la table categorieSite me semble correcte, mais sur la table categorie, il y a une relations qui fait référence à la table site mais qui s'appel user ??? Cela marche, mais on va se retrouver à récupérer les sites de la catégorie par un getUsers() est-ce volontaire ?

    Il manque la relation réciproque sur la table site (pour le lien site <-> categorie). Donc on ne pourra pas depuis un objet site, récupérer toutes les catégories (les n-n sont un des rare cas où la relation doit être définie sur les trois tables, soit 4 déclaration, vu que sur la table de liaison, il y en a 2).

    La liaison entre utilisateur <- site est définie deux fois, ne la garde que sur la table site. Et pourquoi diable l'utilisateur est parfois appelé utilisateur et d'autres fois user ?

    Même chose pour la liaison entre type <- site, deux déclaration, n'en garder qu'une sur site.

    Dans les liaisons, le type n'a pas d'intérêt à être indiqué, le type par défaut suffit, sauf dans le cas des liaisons 1-1, tu peux donc virer tous les type.

    Table vote, la liaison vote <- utilisateur, dans la relation, il manque la clef foreignAlias, idem pour la liaison vote <- site.

    Il manque des déclarations dans la liaison n-n parametre <- parametreSite -> site. La déclaration sur la table site est manquante.

    Bon, voilà pour un premier coup d'œil, je crains qu'un deuxième ne soit nécessaire.

    Beau travail pour la réécriture de ton schéma.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 114
    Par défaut
    Citation Envoyé par mimi68 Voir le message
    Supprime toutes les déclaration des champs Id en integer(4) pour laisser doctrine faire ces propres déclaration d'Id en integer(8), ce qui simplifie le schéma.
    Je les ai rajouté juste avant de poster mon schéma ici


    Citation Envoyé par mimi68 Voir le message
    Bizarrement la liaison n-n avec un argument dans la table de liaison semble fonctionner, ce que je n'était pas arrivé à faire passer. Là, cela semble marcher correctement, mais je n'ai pas fais de fixture pour tester.
    Tant mieux, c'était un point ou j'étais loin d'être sur

    Citation Envoyé par mimi68 Voir le message
    La table site est i18n ready, mais pas les tables catégorie, commentaire (mais là, je peux comprendre, quoique, il faudra étudier des solutions), Parametre, ParametreSite, Type.
    Parce que pour la table site, l'utilisateur aura les champs titre et description disponible dans tout les langues (il peut les laisser vide).
    Pour Commentaire, je ne l'ai pas mis mais j'ai un champ "langue" qui est la culture de l'utilisateur qui a posté ce commentaire, et du coup, seul ceux avec la même culture le verront.
    Pour le reste, leurs libellé sera mis dans la fonction __() et donc le plugin mgI18n prendra le relai.

    Citation Envoyé par mimi68 Voir le message
    Je ne comprend pas la liaison entre categorie <- categorieSite -> site. En effet, la table categorieSite me semble correcte, mais sur la table categorie, il y a une relations qui fait référence à la table site mais qui s'appel user ??? Cela marche, mais on va se retrouver à récupérer les sites de la catégorie par un getUsers() est-ce volontaire ?
    C'est corrigé (copié collé foireux)

    Citation Envoyé par mimi68 Voir le message
    Il manque la relation réciproque sur la table site (pour le lien site <-> categorie). Donc on ne pourra pas depuis un objet site, récupérer toutes les catégories (les n-n sont un des rare cas où la relation doit être définie sur les trois tables, soit 4 déclaration, vu que sur la table de liaison, il y en a 2).
    La doc de Doctrine m'a trompé pour le coup :/
    http://www.doctrine-project.org/proj...s:many-to-many

    Citation Envoyé par mimi68 Voir le message
    La liaison entre utilisateur <- site est définie deux fois, ne la garde que sur la table site. Et pourquoi diable l'utilisateur est parfois appelé utilisateur et d'autres fois user ?
    Donc je dois supprimer ça ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Site:
      relations:
        Utilisateur:
          foreignAlias: Sites
    Parce que je voulais faire en sorte que lorsqu'on supprime un utilisateur, ses sites le sont aussi, donc j'ai rajouté ça dans Utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Utilisateur:
      relations:
        Site:
          local: id
          foreign: utilisateur_id
          type: many
          onDelete: CASCADE
    C'est pour ça que j'ai remis les id partout (et pour le User, j'ai mis Utilisateur partout ).

    Citation Envoyé par mimi68 Voir le message
    Même chose pour la liaison entre type <- site, deux déclaration, n'en garder qu'une sur site.
    C'est fait.

    Citation Envoyé par mimi68 Voir le message
    Dans les liaisons, le type n'a pas d'intérêt à être indiqué, le type par défaut suffit, sauf dans le cas des liaisons 1-1, tu peux donc virer tous les type.
    Même les foreignType ?

    Citation Envoyé par mimi68 Voir le message
    Table vote, la liaison vote <- utilisateur, dans la relation, il manque la clef foreignAlias, idem pour la liaison vote <- site.
    C'est fait.

    Citation Envoyé par mimi68 Voir le message
    Il manque des déclarations dans la liaison n-n parametre <- parametreSite -> site. La déclaration sur la table site est manquante.
    Encore une fois pour les n-n, j'ai suivit la doc de Doctrine : http://www.doctrine-project.org/proj...s:many-to-many
    Quelquechose cloche vraiment ?

    Citation Envoyé par mimi68 Voir le message
    Bon, voilà pour un premier coup d'œil, je crains qu'un deuxième ne soit nécessaire.

    Beau travail pour la réécriture de ton schéma.
    En tout cas je te remercie pour le temps que tu m'a accordé, voilà donc la nouvelle version de mon schéma (complet) :

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    Categorie:
      columns:
        libelle:
          type: string(45)
      relations:
        Site:
          foreignAlias: Categories
          class: Site
          refClass: CategorieSite
    CategorieSite:
      columns:
        categorie_id:
          type: integer(4)
          primary: true
        site_id:
          type: integer(4)
          primary: true
        valeur:
          type: string(45)
      relations:
        Categorie:
          foreignAlias: CategorieSites
        Site:
          foreignAlias: CategorieSites
    Commentaire:
      actAs:
        Timestampable:
      columns:
        utilisateur_id:
          type: integer(4)
        site_id:
          type: integer(4)
        texte:
          type: string()
        langue:
          type: string(2)
        etat:
          type: string(1)
        ip:
          type: string(16)
      relations:
        Utilisateur:
          foreignType: one
        Site:
          foreignType: one
    Parametre:
      columns:
        libelle:
          type: string(150)
      relations:
        Utilisateurs:
          foreignAlias: Parametres
          class: Site
          refClass: ParametreSite
    ParametreSite:
      columns:
        parametre_id:
          type: integer(4)
          primary: true
        site_id:
          type: integer(4)
          primary: true
        valeur:
          type: string(45)
      relations:
        Parametre:
          foreignAlias: ParametreSites
        Site:
          foreignAlias: ParametreSites
    Site:
      actAs:
        Timestampable:
        I18n:
          fields: [titre, description]
      columns:
        utilisateur_id:
          type: integer(4)
        type_id:
          type: integer(4)
        etat:
          type: string(1)
        titre:
          type: string(150)
        description:
          type: string()
        longitude:
          type: float(18)
        latitude:
          type: float(18)
        adresse:
          type: string(150)
        codepostal:
          type: string(10)
        ville:
          type: string(150)
      relations:
        Utilisateur:
          foreignAlias: Sites
        Type:
          foreignAlias: Sites
        Parametre:
          foreignAlias: Sites
    Type:
      columns:
        libelle:
          type: string(150)
    Utilisateur:
      actAs:
        Timestampable:
      columns:
        email:
          type: string(254)
          notnull: true
        nom:
          type: string(150)
        prenom:
          type: string(150)
        adresse:
          type: string()
        codepostal:
          type: string(10)
        ville:
          type: string(150)
        pays:
          type: string(2)
        telephone:
          type: integer(4)
        siteweb:
          type: string(254)
        type:
          type: string(1)
          default: 'U'
          notnull: true
        etat:
          type: integer(4)
          default: '0'
      relations:
        Site:
          local: id
          foreign: utilisateur_id
          onDelete: CASCADE
    Vote:
      actAs:
        Timestampable:
      columns:
        site_id:
          type: integer(4)
        utilisateur_id:
          type: integer(4)
        note:
          type: integer(4)
      relations:
        Utilisateur:
          foreignAlias: Utilisateurs
          foreignType: one
        Site:
          foreignAlias: Sites
          foreignType: one

  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
    Je ne reviendrais pas sur chacun des poins, ce qui rendrait le message illisible !

    Juste pour les relations n-n, le schéma donné dans la documentation de doctrine est correcte et fonctionne parfaitement (ouf). Mais, pour symfony et la génération (notamment des form et des modules d'administration) cela ne fonctionne bien que si la déclaration existe sur les deux côté des tables de la relation n-n.

    Par contre, pour les relations 1-n, il est beaucoup plus simple de ne mettre la déclaration que d'un côté, généralement je préfère le coté n, c'est plus simple à écrire. Et il n'est pas nécessaire de préciser le type, doctrine ne se trompe pas (du moins, encore jamais vu ni lu) (si tu as un id unique d'un côté et un non unique de l'autre, il traite en 1-n).

    Ok pour les traduction, quoique, pour les libellés des ? cela limite les créations de nouveaux libellé puisqu'il faudra simultanément modifier les fichiers de traduction (mgI18N ? faut que je regarde mais je ne pense pas qu'en production, cela soit utilisable).


    Encore quelques remarques :
    Table catégorie, relation site. Le nom de la relation est au singulier, hors il va retourner un doctrine_collection (plusieurs sites), il est donc plus simple de le mettre au pluriel, la directive class précisant le nom au singulier est présente, je pense qu'il s'agit d'un oubli.

    Table site, pas de relation réciproque vers catégorie.

    Table commentaires, les relations gagnerais à êtres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      relations:
        Utilisateur:
          foreignAlias: Commentaires
        Site:
          foreignAlias: Commentaires
    Ce qui simplifierais la lecture du modèle pour un $utilisateur, ses commentaires seront alors récupéré par $utilisateur->getComentaires()

    Table site, la relation vers paramètres est incomplet refclass et class manquent, de plus elle est au singulier alors qu'elle va retourner un doctrine_collection.

    Table utilisateur, la liaison avec site n'est pas correcte, toujours manque du s et de la directive class.

    Table Vote, la relation vers utilisateur n'est pas correcte, le foreingAlias devrait être votes (en effet, on va vouloir faire un $utilisateur->getVotes() pour récupérer la collection des votes et non pas un $utilisateur->getUtilisateurs() qui retournerait bien la collection des votes mais ne serait pas très lisible !). Idem pour la relation vers site.


    Je suis passé un peu vite, mais je pense avoir tous mis.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/08/2014, 07h53
  2. [AC-2007] Question sur les relations des tables
    Par Abed_H dans le forum IHM
    Réponses: 2
    Dernier message: 21/03/2010, 21h10
  3. Petite question sur les relation N-N
    Par arn000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2008, 14h18
  4. Question sur les relations entre les objets
    Par kedare dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 18/04/2008, 14h13
  5. Réponses: 2
    Dernier message: 08/01/2008, 05h56

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