Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > ORM > Doctrine
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 05/12/2010, 02h46   #1
Invité de passage
 
Inscription : octobre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 5
Points : 0
Points : 0
Par défaut Relation Many To Many

bonjour,
voila mon problème j'ai le schéma suivant :

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
Table1:
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
    for_id:
      type: integer(4)
      fixed: false
      unsigned: false
    title:
      type: string(255)
 
Table2:
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
    for_id:
      type: integer(4)
      fixed: false
      unsigned: false
    title:
      type: string(255)
 
 
Table3:
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
    for_id:
      type: integer(4)
      fixed: false
      unsigned: false
    title:
      type: string(255)
 
Association:
  columns:
    for_id::
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
    to_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
 
Indication:
  columns:
    to_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
    title:
      type: string(255)
A partir de cela, je dois mettre en place les relations de manière à avoir pour les table 1 2 et 3 les Indications correspondantes :
Citation:
Table1 0,1 <-> 1,1 Association 0,n <-> 0,n Indication
Table2 0,1 <-> 1,1 Association 0,n <-> 0,n Indication
Table3 0,1 <-> 1,1 Association 0,n <-> 0,n Indication
Je n'arrive pas à trouver la bonne façon, si j'utilise un classRef, Doctrine me fait systématiquement la jointure sur
Code sql :
Table1.id = Association.for_id
et non
Code :
Table1.for_id = Association.for_id
merci de votre aide,
Sem
Sem4476 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 20h23   #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
Si je résume.

Tu as trois tables (je part de l'idée que les trois tables sont différentes) et tu veux des liaisons n-n passant par une table association vers une table commune.

A mon avis, il va te falloir une table association par table.

Dans ton schéma, il n'y a aucun lien de défini, est-ce volontaire ?
__________________
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 07/12/2010, 23h26   #3
Invité de passage
 
Inscription : octobre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 5
Points : 0
Points : 0
bonjour,
concrètement je pars en fait a l'envers, on m'a donné une Base de données et a partir de ca je veux construire le model.

j'ai donc 3 tables différentes de "constitution" différente. Elles vont avoir toutes les 3 un champ assindiq_id.
A coté de ca, j'ai une table d'étiquette avec toute les étiquettes autorisées du style:

Code :
1
2
3
4
5
6
7
8
9
10
 
Indication:
  columns:
    indiq_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
    title:
      type: string(255)
et donc une table association ( qui serait en principe modélisé avec un classRef ) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
Association:
  columns:
    assindiq_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
    indiq_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
En fait, j'ai pas mis les associations car je sais pas les faire comme je voudrais du style

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Table1:
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
    title:
      type: string(255)
   relations:
     Indications:
        classref: Association
        local: assindiq_id
        foreign: indiq_id
Mais si je fais ca, ca va faire une relation sur id et non assindiq_id,
merci,
Sem
Sem4476 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 16h49   #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
De ce que je comprend ton schéma ne peut pas fonctionner.

Comment la table "association" avec un seul champ "assindiq_id" peut-elle rediriger vers trois tables différente ? Comment peut-elle retrouver vers quel table la liaison doit ce faire ? Comment gérer un "assindiq_id" identique sur deux table différentes qui joindraient vers le même libellé ? Vu le schéma actuel, c'est irréalisable.

Dans tous les cas, il n'est pas possible de déclarer dans doctrine une triple liaison a partir d'une seul table de liaison. Quoique, avec un champ supplémentaire et en utilisant l'héritage, on devrait y arriver.
__________________
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 10/12/2010, 00h17   #5
Invité de passage
 
Inscription : octobre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 5
Points : 0
Points : 0
bonsoir,
concrètement, le système peut fonctionner, je veux récupérer les étiquettes d'une de mes 3 tables je fais en SQL un truc comme ca:
Code :
1
2
3
4
5
 
SELECT t1.*, i.* 
FROM Table1 as t1
LEFT JOIN Association as ass ON t1.assindiq_id = ass.assindiq_id
LEFT JOIN Indication as i ON ass.indiq_id = i.indiq_id;
D'ailleurs avec d'octrine une relation type many <-> many marcherait presque sauf que la premiere jointure va se faire sur la clé primaire de t1 et non un champ prédéfini, en gros Doctrine me donnerait ca
Code :
1
2
3
4
5
SELECT t1.*, i.* 
FROM Table1 as t1
LEFT JOIN Association as ass ON t1.id = ass.assindiq_id
LEFT JOIN Indication as i ON ass.indiq_id = i.indiq_id;
Je vois pas comment lui dire donc que je souhaites que la relation se réalise sur un identifiant choisi et non la clé primaire,
merci,
Sem
Sem4476 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 22h57   #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
L'idéal, pour les nested tables, est d'utiliser les objets doctrine, plutôt que son propre code SQL. En fais, l'idée, avec doctrine, est de ne jamais taper de code SQL, ce qui permet de garantir une indépendance vis-à-vis de la couche base de données.

La difficulté, avec une relation n-n réflective va être, justement, de gérer les niveaux et les enchainements de requêtes, ce qui ne sera pas le cas d'un arbre.
__________________
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
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h09.


 
 
 
 
Partenaires

Hébergement Web