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 :

Du SQL au YML en gardant les actions on-delete de la clé étrangère


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut Du SQL au YML en gardant les actions on-delete de la clé étrangère
    Bonjour à tous,

    Je travaille actuellement sur une assez grosse base de données que j'ai modélisée avec le logiciel Mysql-Workbench pour me faciliter la tache.
    J'effectue donc toutes mes relations et le tout le tralala...
    Puis je génère mon fichier.sql et je le lance ds Mysql afin de créer ma base de données.
    Enfin, utilisant le framework symfony, j'utilise la commande "php symfony doctrine:build-schema" afin de générer mon shema.yml à partir de la base créée auparavant.
    Malheur pour moi, le shema.yml est bien généré mais sans les actions on-delete et sans les auto-increment.
    J'ai vraiment pas envi décrire tout cela à la main étant donné que la base est assez grosse.
    Il y a t-il un moyen de généré les actions on-delete en même temps que le shema.yml à partir d'un fichier.sql?

    Merci d'avance!

  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
    Dans les relations, le "ondelete" est la valeur par défaut... donc il n'y a rien à faire.

    Par contre, l'auto-incrément est plus étonnant. Est-ce qu'il est bien intégré dans MySql ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    D'après mes petites recherches il existe un plugin Doctrine pour Mysql-Workbench qui génère les actions on-delete (cascade etc...). En revanche j'ai cru lire qu'il ne serait pas fiable a 100%.
    Quelqu'un d'expérience pourrait-il m'éclairé? D'ailleurs je suis loin d'être le seul confronté au problème car même le plugin symfony pour Workbench ne prend pas en compte les actions on-delete et on-update.
    Merci

    Annexe plugin doctrine pour mysql-workbench:
    http://code.google.com/p/mysql-workb...ctrine-plugin/

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    Dans ma base de données j'ai certain on-delete avec cascade et d'autre avec set-null. Donc je ne pense pas pouvoir laisser mon schema.yml comme d'origine.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    petit lien intéressant:
    http://blog.mazenod.fr/2010/03/outil...-pour-symfony/

    Qui résume le problème en apportant des solutions.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    Donc j'ai testé le plugin Doctrine sous Mysql-Workbench et le résultat est satisfaisant (à première vue). les on-delete: cascade et set-null sont bien générés.

    J'espère avoir contribué à la démocratisation du framework symfony et doctrine

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    J'ai un problème

    Quand j'utilise mon fichier.sql pour créer ma base (directement sur Mysql), les on-delete cascade fonctionnent super bien. Alors que quand j'utilise le schema.yml généré par le puglin doctrine pour créer ma base (à partir de symfony), les actions on-delete sont bien là mais quand je supprime un parent Mysql me retourne l'erreur:

    #1452 - Cannot add or update a child row: a foreign key constraint fails ... ON DELETE CASCADE ON UPDATE NO ACTION

    à ne rien comprendre

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    Quand je craie ma base de données avec le schema.yml généré par le plugin Doctrine, et que je "reredéfinie" les actions on-delete: cascade directement sur Mysql tout fonctionne super bien

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 89
    Par défaut
    Bonjour,

    J'ai le même genre de problème que vous.

    Voilà mon erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`db_lrs/TDossier`, CONSTRAINT `TDossier_numdossier_TMedaille_tdossier_numdossier` FOREIGN KEY (`NumDossier`) REFERENCES `TMedaille` (`TDossier_NumDossier`))
    Et voilà mon schéma :

    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
    TMedaille:
      connection: doctrine
      tableName: TMedaille
      columns:
        nummedaille:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: true
          autoincrement: false
        tdossier_numdossier:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: false
          notnull: true
          autoincrement: false
        tprofile_numprofile:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: false
          notnull: true
          autoincrement: false
        tnuance_numnuance:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: false
          notnull: true
          autoincrement: false
        tclasse_numclasse:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: false
          notnull: true
          autoincrement: false
        roul:
          type: enum(6)
          fixed: false
          unsigned: false
          values:
            - INRA
            - SAULON
          primary: false
          notnull: true
          autoincrement: false
        annee:
          type: integer(8)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
      relations:
        TClasse:
          local: tclasse_numclasse
          foreign: numclasse
          type: one
        TDossier:
          onUpdate: CASCADE 
          onDelete: CASCADE 
          local: tdossier_numdossier
          foreign: numdossier
          type: one
        TNuance:
          local: tnuance_numnuance
          foreign: numnuance
          type: one
        TProfile:
          local: tprofile_numprofile
          foreign: numprofile
          type: one
        TSoudure:
          local: nummedaille
          foreign: tmedaille_nummedaille
          type: many
    TDossier:
      connection: doctrine
      tableName: TDossier
      columns:
        numdossier:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: true
          autoincrement: false
        annee:
          type: integer(8)
          fixed: false
          unsigned: false
          primary: false
          autoincrement: false
      relations:
        TMedaille:
          local: numdossier
          foreign: tdossier_numdossier
          type: many
    Je ne peux pas changer le numéro de dossier d'une médaille, j'ai l'erreur qui apparaît.
    Qqun a une idée?

  10. #10
    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 pense qu'il y a confusion dans la double déclaration de liaison entre tes deux tables.

    La liaison ne doit être déclaré que d'un côté de la liaison, jamais des deux, c'est source d'erreurs. On peut déclarer les valeurs de l'autre table en précédant les mots clefs par foreign.

    Garde la liaison du côté multiple (c'est ce que je fais en général, mais cela marche de l'autre côté et supprime toutes les références à la liaison sur l'autre table.

    Après, ou cela c'est résolut tous seul, où on cherche plus loin.

    De mes préférences, on ne change jamais la valeur d'une clef, dont le numéro de médial ne serait pas, à priori, clef primaire, mais un champ ID sans intérêt sémantique, autre que la liaison. Plus de problème de mise à jour en cascade.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 89
    Par défaut
    Merci encore une fois mimi68 !

    J'ai fait comme tu l'as dit, j'ai mis la liaison d'un seul côté, j'ai refait mes modèles, mes filters et mes forms et c'est bon ça marche !

    Merci à toi

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    Bonjour,
    Perso j'ai fais tout mon schema.yml à la main avec la même syntaxe/sementique que le projet JOBEET parce que j'en avais mare.
    Et tout fonctionne nikel

  13. #13
    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'avoue !

    Je fais les schémas sur papier et après, je les transformes à la main en fichier yaml. Méa culpa, méa maxima culpa

    Depuis peu, j'utilise freeMind pour préparer les schémas, c'est un peu plus rapide que le papier et moins contraignant qu'un logiciel spécialisé.

Discussions similaires

  1. requete sql max de sum/sum en gardant les autres infos
    Par gwena54 dans le forum Requêtes
    Réponses: 17
    Dernier message: 27/06/2007, 12h13
  2. Comment désactiver les actions automatiques de Windows ?
    Par j-phi dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 06/01/2005, 12h53
  3. Réponses: 6
    Dernier message: 06/10/2004, 10h41
  4. [Struts] question bete sur les Action et Form
    Par seb_fou dans le forum Struts 1
    Réponses: 2
    Dernier message: 06/09/2004, 15h24

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