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 :

Perte de "Unique" avec doctrine::build-schema sous symfony [Doctrine]


Sujet :

ORM PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Points : 88
    Points
    88
    Par défaut Perte de "Unique" avec doctrine::build-schema sous symfony
    Bonjour à tous,
    Je suis nouveau sur symfony et je rencontre quelques problèmes au niveau de la construction du schéma.

    Pour simplifier le problème on va dire que j'ai une base de donnée avec 2 tables:
    Une table "Individual" (email,password,activated) qui sert à l'inscription des membres et une table "Individual_Profile" pour stocker les infos de profil (nom,prénom,date de naissance...)
    La relation entre les deux tables est de type 1-1

    J'ai utilisé un logiciel afin de créer mes tables et leurs relations de manière graphique (en fait j'ai pas seulement 2 tables mais un peu plus d'une quinzaine).
    Je génère un fichier sql qui me donne:
    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
     
    CREATE TABLE Individual (
      Id        int(10) NOT NULL AUTO_INCREMENT, 
      Email     varchar(255) NOT NULL UNIQUE, 
      Password  varchar(255) NOT NULL, 
      Activated varchar(255) NOT NULL, 
      AddressId int(10) UNIQUE, 
      PRIMARY KEY (Id)) CHARACTER SET UTF8;
     
    CREATE TABLE Individual_Profile (
      Id           int(10) NOT NULL AUTO_INCREMENT, 
      LastName     varchar(255) NOT NULL, 
      FirstName    varchar(255) NOT NULL, 
      DateOfBirth  date NOT NULL, 
      Picture      varchar(255), 
      IndividualId int(10) NOT NULL UNIQUE, 
      PRIMARY KEY (Id)) CHARACTER SET UTF8;
     
    ALTER TABLE Individual_Profile ADD INDEX FKIndividual547380 (IndividualId), ADD CONSTRAINT FKIndividual547380 FOREIGN KEY (IndividualId) REFERENCES Individual (Id);
     
    ALTER TABLE Individual ADD INDEX FKIndividual681006 (AddressId), ADD CONSTRAINT FKIndividual681006 FOREIGN KEY (AddressId) REFERENCES Address (Id);
    Ensuite j'importe tout ca depuis le fichier .sql dans ma base de donnée mySql et tout se passe bien. Ci dessous extrait de ma table Individual_Profile

    Nom de l'index Type Unique Compressé Colonne
    PRIMARY BTREE Oui Non Id 0 A
    IndividualId BTREE Oui Non IndividualId 0 A
    FKIndividual547380 BTREE Non Non IndividualId 0 A

    En gros la clé IndividualId est bien unique.
    Ensuite j'utilise la fonction de symfony doctrine:build-schema afin de recupérer le schéma depuis ma base de donnée pour ensuite générer les forms et classes correspondants.
    Sauf qu'à ce moment là, symfony me sort:
    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
    Individual:
      connection: doctrine
      tableName: individual
      actAs: { Timestampable: ~ }
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        email:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        password:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        activated:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        addressid:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
    
        IndividualProfile:
          local: id
          foreign: individualid
          type: many
    Je me retrouve avec un "Individual" qui peut avoir plusieurs "Profiles"????
    Si quelqu'un peut m'aider car j'ai beau chercher, je suis incapable de trouver l'erreur!
    Merci
    John

  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
    La bonne méthode, pour créer une base avec symfony consiste à créer le shema.yml et à en faire la base.

    Partir d'une base créer avec un outils quelconque et importée sous symfony ne pourra que donner de mauvais résultat et ne doit être utilisé que dans les cas extrêmes. Et même là, des ajustement manuels sont généralement nécessaire.

    Part du shema que tu as fais visuellement pour construire avec ton éditeur un shema.yml qui correspondra aux objets du modèles que tu souhaites manipuler, doctrine se chargera de créer les tables nécessaires.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Points : 88
    Points
    88
    Par défaut
    Merci déjà pour ta réponse,
    Résoudre le problème à la main directement dans le fichier schema.yml c'est déjà fait, j'ai remplacé les "many" par "one" et tout est rentré dans l'ordre.

    Ce qui m'embête c'est que indépendamment du logiciel utilisé les tables étaient bien configurées sur mysql,et c'est seulement lors de leur chargement de la base de données vers schema.yml que l'erreur est apparue.
    De plus le logiciel que j'utilise c'est celui de Visual Paradigm, je le teste dans le cadre d'un "peut être" achat pour ma société, donc j'aimerai bien avoir toutes les billes en main pour prendre ma décision à la fin des 30jours d'essai (Vu le prix de la licence je vais pas me risquer ...)

    Si quelqu'un connait un peu plus ce problème, merci d'avance,
    John

  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
    Citation Envoyé par johnbenz Voir le message
    Si quelqu'un connait un peu plus ce problème, merci d'avance
    faut parcourir un peu les forum avant de pondre ceci !

    Plus sérieusement, si tu veux travailler d'une manière performante avec doctrine 1 ou 2, tu n'as d'autre choix que de partir de ton modèle objet. Si cela ne suis pas ce que tu imaginais il y a encore 3 jours, change de manière de voir.

    Pour éviter au maximum les emmerdes lors du développement, il faut que le modèle (ici décrit dans shema.yml) soit à l'origine des tables et non l'inverse.

    Accessoirement, il faut respecter les conventions de nommages utilisées sous symfony/doctrine pour éviter d'autre complications ultérieurs dans le modèle. En prime, sur une relation 1-n correctement définie, il n'est pas nécessaire de préciser un type ou un foreignType, c'est la valeur par défaut.

    Donc reprends ton schéma réalisé sur le logiciel d’analyse que tu veux, essaye d’imaginer comment tu vas en créer un modèle objet permettant de travailler les données, dans ton programme, en objet, au mieux. Écris le shema.yml qui te semble correcte, génère la base que ton modèle considère nécessaire pour pouvoir fonctionner et tu éviteras de très nombreux problèmes.

    Mais après, c'est toi qui est maître de ton développement et tu peux te passer de conseils...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  5. #5
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    Marant, je suis nouveau sur le forum (employé depuis peu dans une boîte où je fais de la R&D symfony, du coup j'ai du temps et des neurones à reposer ^^), et c'est au moins la 4ème fois en une semaine que je vois ces problemes de BDD => schema au lieu de l'inverse

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Points : 88
    Points
    88
    Par défaut
    Je n'ai pas dit que je ne voulais pas écouter les conseils, si je suis sur un forum c'est justement pour connaitre l'avis des gens. Après la décision sera mienne, elle sera bonne ou moins bonne, mais j'aime bien aussi savoir pourquoi quelque chose ne fonctionne pas.
    J'ai bien pris note de ton conseil qui est de commencer directement par la création du fichier schema.yml et au vu de tes divers posts et de ta participation sur ce forum je me dis qu'il y a 90% de chances que celà soit la meilleure solution.
    D'un autre côté j'aime bien avoir tous les éléments en mains pour faire un choix. Il y a une fonction "build-schema" et si elle existe, il doit bien y avoir une raison. Si elle ne marche pas, là aussi j'aimerai bien comprendre pourquoi.
    Voilà donc maintenant si tu sais pourquoi ça a merdé dans mon cas et que tu veux bien me l'expliquer, je t'en remercie d'avance.
    Bonne fin d'aprem,
    John

  7. #7
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    Je te présente mes excuses si tu t'es senti agressé Johnbenz, je t'assure que ça n'était pas du tout mon intention (pour Michel Rotta par contre je sais pas : ça m'a l'air d'un bad boy )

    La fonction build-schema est présente pour faciliter l'évolution d'un système déjà existant vers Symfony. Par exemple, si une boîte possède déjà un site web en php "home made" qui tourne depuis un certain temps, qui souhaite migrer son architecture vers Symfony, et qui ne peut donc pas juste détruire la BDD existante.
    Cependant dans ce cas précis, la tâche "build-schema" n'est qu'une étape d'un processus de migration complexe : générer un premier jet de fichier schema.yml, puis synchroniser pas à pas Symfony et l'existant, chose qui ne peut être faite qu'à la main.

    Tout ça pour revenir au fait que lorsqu'il n'y a pas encore d'existant, générer d'abord une BDD pour ensuite en déduire le schema.yml est source de perte de temps et d'instabilité à long terme. Donc pas vraiment une procédure à adopter ...

    Pour le cas de Visual Paradigm, je ne connais pas ce logiciel, mais si ce qui t'interesse est de pouvoir construire tes modèles "graphiquement", je te conseille de plutôt te tourner vers un logiciel capable de créer directement le schema.yml plutôt que de faire "creation graphique" => "creation de BD" => "génération de schema.yml". Je sais qu'il en existe au moins un qui avait l'air de générer un code plutôt propre, je te tiendrais au courant quand j'aurais retrouvé le nom

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Points : 88
    Points
    88
    Par défaut
    Non ne t'inquiète pas Maerlyn31, je n'ai pas du tout mal pris ton post, ni celui de Michel Rota d'ailleurs, c'est juste que j'ai un peu du mal avec le phénomène majeur dans les forums qui est de répondre "c'est pas bien, fait comme ça" sans jamais donner d'explication du "pourquoi c'est pas bien?".

    Pour mes bases de données, je peux les refaire à la main, ca me prendra un certain temps mais c'est pas la fin du monde non plus. Juste que je suis un bon feignant et je trouvais la solution de l'outil graphique assez attirante, surtout pour faire évoluer et modifier plus facilement les bases de données: dans le cas où l'info est bien convertie d'un système à l'autre.

    En tout cas merci pour ta réponse, et si tu as le nom de ton logiciel, je suis intéressé pour l'essayer,
    Bonne soirée,
    John

  9. #9
    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
    Bon, pour mon coup de sang, 8h du mat, réveillé partiellement et j'essaye de répondre et dépanner un maximum de personnes. C'est parfois bref, mais si c'est bref c'est que j'ai déjà répondu 10x fois (surement plus) à l'identique pour cette même question. Et que le "Si quelqu'un connait un peu plus ce problème, merci d'avance" en réponse à ma réponse précédente m'a paru, lui, réellement très déplacé.

    Quant au fait que tu ne me fais confiance qu'à 90%, c'est qu'il me reste du travail à faire pour faire monter ce pourcentage à 99,9%...

    Je plussoie ce que Maerlyn31 a donné comme explication pour le build:shema.

    Maintenant, pourquoi faire le schéma ou plutôt le modèle objet dans symfony plutôt que de ce contenter de reprendre le schéma de la base de données ? Parce que dans ton développement future (qu'à ce stade tu n'as fait qu'effleurer) tu n'attaqueras presque jamais la base de données directement mais son modèle objet. Il convient donc que ce modèle objet corresponde le plus possible à ce que tu veux pouvoir utiliser dans ton code, plutôt qu'à un modèle physique de données qui, lui, ne te sera peut-être pas favorable une fois rendu en objet. De plus, sumfony/doctrine offrent en standard et en plugins de nombreuses fonctionnalités qui rendent ta programmation plus simple mais qui impacte directement ton MPD, toutes choses dont tu devrais te passer si tu interviens en directe, je pense notamment à la traduction des tables (I18n), aux héritages, aux timestamp, aux nestedset,... Il faut donc d'abord penser aux objets représentants les données que tu veux manipuler, le MCP n'en sera qu'une représentation physique et à donc moins d'importance. Il est donc logique de concevoir en priorité ton modèle objet et d'en déduire ton MPD.

    Quant à l'outil sus cité, je pense qu'il s'agit de MySqlWorkbench. Il possède une fonction qui permet de générer un début relativement correcte de modèle objet à partir d'un MPD. L’inconvénient étant qu'il est indispensable de le reprendre pour y inclure les spécificité du couple symfony/doctrine dont tu souhaiterais bénéficier et qu'une fois ton shema.yml final près à être utilisé, il est alors impossible de ce servir de MySqlWorkbench pour y effectuer directement des modifications. Il peut cependant être utilisé pour faire de la revers ingénierie.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Points : 88
    Points
    88
    Par défaut
    Désolé si mon commentaire t'as paru déplacé, le but n'était pas de t'offenser.
    En tout cas je prends note de ta réponse et de celle de Maerlyn31, et je vais me replonger un peu plus ds le schema.
    Sinon je t'accorde 95%, j'aime bien me garder une marge de manoeuvre
    Bon week end à tous

  11. #11
    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
    95% soit 50% de mieux en un message... l'avenir est prometteur.

    Reviens avec des bouts de shema.yml quant tu en auras il existe de nombreux truc à connaître que l'on acquière avec l'expérience, une relecture n'est jamais un luxe (mais évite les 50 objets du modèle d'un coup ).
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Points : 88
    Points
    88
    Par défaut
    Pas de soucis, je suis dessus là, et vu la relecture du schema généré, je me rends compte qu'il manque pas mal de détails, pénalisants pour le développement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur sur doctrine:build-schema
    Par death6666 dans le forum ORM
    Réponses: 9
    Dernier message: 27/09/2010, 01h21

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