Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/07/2011, 16h38   #1
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 67
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2008
Messages : 67
Points : 16
Points : 16
Par défaut Relation n-n et ajout dans la BD

Bonjour,

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

Code :
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 :
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 ?
Noobboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h16   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Il y a une erreur dans cette relation
Code :
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.
__________________
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/07/2011, 14h15   #3
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 67
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2008
Messages : 67
Points : 16
Points : 16
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".
Noobboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 22h38   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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...
__________________
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/07/2011, 10h12   #5
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 67
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2008
Messages : 67
Points : 16
Points : 16
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.
Noobboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 09h39   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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.
__________________
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 13h59   #7
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 67
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2008
Messages : 67
Points : 16
Points : 16
Je m'exprime mal.

Oui, la liaison concernent les deux côtés, bien évidemment.

J'ai trouvé plus pertinent de le mettre du côté "Collaboration" que du côté "Institution" car niveau affichage des données c'est là que ça sera présenté au niveau présentation des données. La réflexion n'est peut-être pas très pertinente, je le conçois mais c'est cette réflexion que j'ai eu.
Noobboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 08h52   #8
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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.
__________________
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/07/2011, 14h58   #9
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 67
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2008
Messages : 67
Points : 16
Points : 16
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".

Noobboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h34.


 
 
 
 
Partenaires

Hébergement Web