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] Générer les modèles avec les relations à partir de la BDD


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut [Doctrine] Générer les modèles avec les relations à partir de la BDD
    Bonjour tout le monde,

    voilà quelques jours que je bosse sur un petit projet de CMS utilisant l'ORM Doctrine...

    J'ai commencé à bosser dessus en partant du principe :
    - tout d'abord, j'ecris mes schema YAML
    - je génère les modèles et la base

    Le problème avec cet ordre-là, c'est que j'ai pensé que mon application peut évoluer, il peut y avoir de nouveaux champs etc... et en relançant le script qui génère les modèles et la base, je me retrouve avec un FATAL ERROR (foreign key constraint etc...)

    Je me suis donc dit, travaillons plutot sur cet ordre là :
    - je pose mes tables
    - je génère mes modèles


    Pour l'instant, celà fonctionnait plutot bien, maiis je rencontre un soucis au niveau des relations "MANY TO MANY"...

    Est-ce possible de générer la relation "MANY TO MANY" sur un modèle, avec une convention particulière sur la BDD ?



    --------------------------------
    Voici mon exemple :

    J'ai donc 4 tables : category, post, media et media_post

    La relation simple marche parfaitement mais la relation many to many n'est pas fonctionnelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $post = Doctrine_Core::getTable('Post')->findOneById(1);
     
    // relation one to one
    echo $post->Category->name; // marche parfaitement
     
    // relation many to many
    echo $post->Medias->name; // ne marche pas
     
    // relation one to many
    echo $post->MediaPosts[0]->Media->name // marche parfaitement, mais n'est pas un raccourcis...
    Voili voilou, j'espere qu'il y a une façon de générer ce type de relation... j'ai beaucoup aimé le fait de travailler sur des fichiers YAML, mais la modification des tables de la base de donnée et ses relations est fortement possible... et ce cms sera dans le but de gagner du temps sur le développement... :p en esperant que quelqu'un ait une petite idée ! merci beaucoup !

    Très bonne soirée,

    Cordialement,
    Léo

  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
    Tu peux mettre ton shema.yml ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut
    Bonjour Michel Rotta, désolé pour mon oublie

    Après avoir créé mes tables sur phpmyadmin( en innoDB avec mes relations), je lance le script permettant de générer le YAML à partir de la BDD (Doctrine_Core::generateYamlFromDb) et voila le schema obtenu :

    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
     
    Category:
      connection: doctrine
      tableName: category
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        name:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Post:
          local: id
          foreign: category_id
          type: many
    Media:
      connection: doctrine
      tableName: media
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        name:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        file:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        MediaPost:
          local: id
          foreign: media_id
          type: many
    MediaPost:
      connection: doctrine
      tableName: media_post
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        media_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        post_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Post:
          local: post_id
          foreign: id
          type: one
        Media:
          local: media_id
          foreign: id
          type: one
    Post:
      connection: doctrine
      tableName: post
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        name:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        content:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        category_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Category:
          local: category_id
          foreign: id
          type: one
        MediaPost:
          local: id
          foreign: post_id
          type: many


    Alors que le schema que j'aimerai obtenir est le yaml ci-dessous, contenant les liaisons de many to many de Post à Media, et inversement (et non les liaisons par rapport à la table de liaison MediaPost) :

    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
     
    Post:
      columns:
        id:
          primary: true
          autoincrement: true
          type: integer(4)
        title: string(255)
        content: text
        category_id:
          type: integer(4)
          primary: true
          notnull: true
        valid:
            type: integer(1)
      relations:
        Category:
          local: category_id
          foreign: id
          foreignAlias: post
        Medias:
          foreignAlias: Posts
          class: Media
          refClass: MediaPost
     
    Category:
      columns:
        id:
          primary: true
          autoincrement: true
          type: integer(4)
        name: string(255)
     
    Media:
      columns:
        id:
          primary: true
          autoincrement: true
          type: integer(4)
        name: string(255)
        file_mini: string(255)
        file_preview: string(255)
        file_original: string(255)
      relations:
        Posts:
          foreignAlias: Medias
          class: Post
          refClass: MediaPost
     
    MediaPost:
      columns:
        id:
          primary: true
          autoincrement: true
          type: integer(4)
        media_id: integer(4)
        post_id: integer(4)
      relations:
        Media:
          foreignAlias: MediaPosts
        Post:
          foreignAlias: MediaPosts
    Peux-t-on obtenir ce genre de schema YAML en respectant des convetions ou autre ? merci

    A bientôt,
    Cordialement,

    Léo

  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
    Le schéma que tu souhaites est bon, presque parfait. Le revoici très légèrement modifié
    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
     
    post:
      columns:
        title: string(255)
        content: text
        category_id:
          type: integer
          notnull: true
        valid:
            type: integer(1)
      relations:
        Category:
          local: category_id
          foreign: id
          foreignAlias: posts
        Medias:
          foreignAlias: posts
          class: media
          refClass: media_post
     
    Category:
      columns:
        name: string(255)
     
    Media:
      columns:
        name: string(255)
        file_mini: string(255)
        file_preview: string(255)
        file_original: string(255)
     
    MediaPost:
      columns:
        media_id: 
          type: integer
          primaty: true
        post_id: integer
          type: integer
          primaty: true
      relations:
        Media:
          foreignAlias: MediaPosts
        Post:
          foreignAlias: MediaPosts
    • Si on ne défini pas de clef primaire, doctrine crée automatiquement un champ id integer(8) auto-incrémenté et clef primaire. Autant le laisser faire.
    • table post, champ catégorie_id. La clef primaire ne doit pas comprendre de donnée unitaire susceptible de changer (fn4 je crois) donc categorie_id ne peut faire partie de la clef primaire. Et n'a aucun intérêt à y être. De plus, doctrine gère très mal les clefs primaires multi champs sont difficiles à gérer sous doctrine, sauf exception de la table de liaison dans le cas d'une liaison n-n.
    • table post, champ valid. A mon avis un champ boolean serait mieux.
    • table post, relations. Un truc, le nom des tables ne finit jamais par "s". Les relations, si elles nous retournent plusieurs enregistrement verrons leurs nom pourvu d'un "s", pour savoir qu'on a un doctrine_collection en retour. Donc le foreignAlias dans la relation vers categorie devient "posts".
    • le nom des tables, champs et liens sont en minuscules.
    • table category, même remarque pour l'id. Il est maintenant compatible, en longueur, avec celui de la table post.
    • table media. La relation media-post est déjà correctement définie sur la table média, une relation ne doit être définie que sur une des deux tables pour éviter les doublons non compatibles. Trappe.
    • table mediapost. L'exception sur les clefs primaire, elle est ici composé des deux clefs permettant la liaison. Donc pas de champ id auto-incrémenté. Les clef sont passé à integer(8), hors, 8 est la valeur par défaut pour integer.


    Regarde le schéma est les modifications proposées, met ton schéma à jour, oublie phpMyAdmin pour la création des tables et génère ton modèle à partir du schéma et non le contraire.

    Tout de suite, cela va marcher mieux.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut
    Re-bonjour,

    Merci pour votre aide et la correction de mon schema YAML ! j'ai appris pas mal de choses avec une réponse de votre part, je vous en remercie !

    Je comprends très bien le choix de laisser tomber phpMyAdmin pour créer les tables, et de tout baser sur le schema YAML qui sera bien plus complet que phpMyAdmin... D'ailleurs, comme dis sur mon premier post, j'ai beaucoup aimé le système de génération de models + table par rapport au schema YAML... Mais je rencontrais à chaque fois un problème de type FATAL ERROR.

    J'ai donc modifié mon schema YAML avec les corrections que vous m'avez proposé, voila le résultat :

    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
     
    Post:
      columns:
        title: string(255)
        content: text
        category_id:
          type: integer(4)
          notnull: true
        valid:
            type: integer(1)
      relations:
        Category:
          local: category_id
          foreign: id
          foreignAlias: posts
        Medias:
          foreignAlias: posts
          class: media
          refClass: media_post
     
    Category:
      columns:
        name: string(255)
     
    Media:
      columns:
        name: string(255)
        file_mini: string(255)
        file_preview: string(255)
        file_original: string(255)
     
    MediaPost:
      columns:
        media_id:
          type: integer
          primary: true
        post_id:
          type: integer
          primary: true
      relations:
        Media:
          foreignAlias: MediaPosts
        Post:
          foreignAlias: MediaPosts
    En lançant mon script qui génère les modèles + la base de donnée, je rencontre une erreur de type FATAL_ERROR...

    Voici mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Doctrine_Core::dropDatabases();
    Doctrine_Core::createDatabases();
    Doctrine_Core::generateModelsFromYaml('../system/yaml/schema.yml', '../system/models');
    Doctrine_Core::createTablesFromModels('../system/models');
    et voici l'erreur générée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Uncaught exception 'Doctrine_Export_Exception' with message 'SQLSTATE[HY000]: General error: 1005 Can't create table 'lcms.#sql-1374_e0' (errno: 150). Failing Query: "ALTER TABLE post ADD CONSTRAINT post_category_id_category_id FOREIGN KEY (category_id) REFERENCES category(id)". Failing Query: ALTER TABLE post ADD CONSTRAINT post_category_id_category_id FOREIGN KEY (category_id) REFERENCES category(id)'
    Je ne comprends pas il me met ce message d'erreur... Je suis en train d'essayer plusieurs modifications sur le schema YAML, mais rien y fait, toujours la même erreur... Est-ce problématique ?

    Encore merci pour tout !
    Léo

  6. #6
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    on dirait que Doctrine a un utilisateur SQL qui n'a pas le droit de faire des alter table. il faut que tu lui donnes plus de droit tant que tu remodèles la base.

    phpmyadmin nous revoilà.

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/11/2012, 14h24
  2. Réponses: 2
    Dernier message: 20/01/2012, 10h03
  3. les modèles avec GCC
    Par khazna dans le forum C++
    Réponses: 2
    Dernier message: 28/11/2007, 18h26
  4. [VBA][Excel] Avec les modèles Excel.
    Par mulanzia2003 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/08/2006, 10h27

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