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 :

Relation n-n et ajout dans la BD [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 76
    Par défaut Relation n-n et ajout dans la BD
    Bonjour,

    j'ai un léger soucis dans mon projet actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    500 | Internal Server Error | Doctrine_Connection_Mysql_Exception
    SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`appliri_qualif_symfony/Institution_collab`, CONSTRAINT `IcCi` FOREIGN KEY (`collaboration_internationale_id`) REFERENCES `Collaboration_internationale` (`id`) ON DELETE CASCADE)
    Mon schéma.yml :

    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
    Institution:
      tableName: Institution
      columns:
        zone:
          type: string(255)
          notnull: true
        pays:
          type: string(255)
          notnull: true
        nominstitution:
          type: string(255)
          notnull: true
        codepostalorga:
          type: int(5)
          unsigned: true
        ville:
          type: string(255)
        Etat:
          type: string(255)
      relations:
        Collaborations:
          class:        Collaboration_internationale
          refClass:     InstitutionCollab
          foreignAlias: Institutions
        Zone:
          local: zone
          foreign: nom_zone
          foreignAlias: Institutions
        Pays:
          local: pays
          foreign: nom_pays
          foreignAlias: Institutions
     
    Zone:
      tableName: Zone
      columns:
        nom_zone:
          type: string(255)
          primary: true
     
    Pays:
      tableName: Pays
      columns:
        nom_pays:
          type: string(255)
          primary: true
     
    #-----------------------------------------------
     
    InstitutionCollab:
      tableName: Institution_collab
      columns:
        collaboration_internationale_id:
          type: integer(8)
          primary: true
        institution_id:
          type: integer(8)
          primary: true
      relations:
        Institution:
          onDelete:       CASCADE
          foreignAlias:   InstitutionCollabs
        Collaboration_internationale:
          onDelete:       CASCADE
          foreignAlias:   InstitutionCollabs
     
    #-----------------------------------------------
     
    Collaboration_internationale:
      tableName: Collaboration_internationale
      columns:
        porteuriu_id:
          type: integer(8)
          notnull: true
        porteurinternational_id:
          type: integer(8)
          notnull: true
      relations:
        Porteurs_iu:
          class: Personne
          local: porteuriu_id
          foreignAlias: CollaborationInternationalesIUs
        Porteur_inter:
          class: Personne
          local: porteurinternational_id
          foreignAlias: CollaborationInternationalesInters
     
     #-----------------------------------------------
     
    Statut_inter:
      tableName: statut_inter
      columns:
        collaboration_internationale_id:
          type: integer(8)
          primary: true
        personne_id:
          type: integer(8)
          primary: true
        libelle_statut:
           type: string(255)
           notnull: true
      relations:
        Personne:
          onDelete:       CASCADE
          foreignAlias:   StatutInters
        Collaboration_internationale:
          onDelete:       CASCADE
          foreignAlias:   StatutInters
        Libelle_statut_inter:
          class:          LibelleStatutInter
          local:          libelle_statut
          foreign:        nom_statut
          foreignAlias:   StatutInters
    Tout fonctionne très bien lors de l'ajout et de la modification si je laisse une seule institution dans ma collaboration. Mais dès que j'essaye d'ajouter plusieurs institutions, j'ai l'erreur citée ci-dessus.

    Je ne comprend pas trop le pourquoi du comment de cet erreur...

    Quelqu'un aurait-il une idée ?

  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
    Il y a une erreur dans cette relation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      relations:
        Collaborations:
          class:        Collaboration_internationale
          refClass:     InstitutionCollab
          foreignAlias: Institutions
    La class doit être la classe à liée, pas celle de la liaison. La refClass, elle est la classe de liaison. J'ai l'impression qu'il y a ici une inversion.

    Je n'ai pas vérifié le reste.

    Une erreur là pourrait avoir des réactions pour le moins imprévisible.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 76
    Par défaut
    Euh la classe à lier à "Institution" est bien la classe "Collaboration_internationale" et la table d'association (qui doit correspondre à ce que tu appelles une table de liaison.) est la table "InstitutionCollab".

  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
    J'ai repris le modèle au calme, à la maison et effectivement, il est bon...

    D'où une erreur surprenante.

    L'erreur vient de la table : InstitutionCollab
    A priori de l'indexation du champ : collaboration_internationale_id
    Qui ne devrait pas être indexé seul, vu qu'il fait partie d'une clef primaire. Le message semble indiquer que cet indexation est "liée" (???) à la notion de cascade. Ce qui me laisse septique.

    Vérifies dans la table généré (avec phpMyAdmin par exemple) les indexe créés.
    Tu peux aussi essayer sans les cascades pour voir.

    Si tu as un index supplémentaire, il va falloir comprendre d'où il vient. Encore quelques soirées...

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 76
    Par défaut
    Merci de ton aide Michel !

    En relisant en détail, il m'est apparu que :

    1/ Il n'était pas pertinent de mettre la relations vers la table de liaison dans les institutions car inutile à connaître de ce côté là de la relation mais plutôt du côté des collaborations.

    2/ Qu'une fois les modèles et les modules re-générés, celà marchait bien mieux.

    L'erreur venait au final du module que j'avais généré avec une version précédente du modèle (et donc du schéma) qui ne gérait pas correctement la relation n-n...
    (les index était collaboration_internationale_id et institution_id mais vu qu'une des deux foreign keys était sur collaboration_internationale_id, il montrait pour une raison mystérieuse cette contrainte...)

    Au final, j'ai résolu mon problème.

    Merci encore d'avoir passé du temps sur mon problème.

  6. #6
    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 suis un peu surpris par ton point 1. En effet, les liaisons ne doivent être déclarées que d'un côté mais concernent systématiquement les deux côtés (propriété foreign). D'où mon interrogation.

  7. #7
    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 savais bien que l'on parlait de cette structure à plusieurs endroits !!!

    Pour les liaisons n-1, le plus simple, côté rédaction, ce qui me semble important, est de les écrire du côté n de la relation, sur la table où est déclaré la clef externe de la liaison.

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 76
    Par défaut
    Effectivement, il y a une sorte de doublons.

    Ayant d'abord marqué comme "Résolu" le topic précédent, j'en ai recréer un autre pour un problème légèrement différent avant de me rendre compte que les deux étaient liés et donc de revenir au premier sujet en enlevant la mention "Résolu".


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

Discussions similaires

  1. ajout dans la table qui contient le FK (relation 1 - *)
    Par ibrahimCA dans le forum Entity Framework
    Réponses: 11
    Dernier message: 03/05/2013, 18h09
  2. Ajout dans une table "Verbe" (relation n,n)
    Par DonKnacki dans le forum Linq
    Réponses: 1
    Dernier message: 17/03/2010, 10h14
  3. Réponses: 9
    Dernier message: 29/01/2010, 20h25
  4. Ajout dans une table et relation avec d'autres
    Par climz dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 15h32
  5. Connaitre l'unitée à ajouter dans USES
    Par DelphiCool dans le forum Langage
    Réponses: 7
    Dernier message: 01/08/2002, 13h48

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