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 04/02/2011, 00h02   #1
rib
Membre à l'essai
 
Inscription : janvier 2005
Messages : 70
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 70
Points : 23
Points : 23
Par défaut requete sur 3 tables avec une difference

j'ai 3 tables,
1:artist
2:artist_have_links
3:artists_links
voici le shema.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
Artists:
  connection: doctrine
  tableName: artists
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    nom:
      type: string(20)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    id_facebook:
      type: string(30)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    bio:
      type: string(5000)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    ordre:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    ArtistsHaveLinks:
      local: id
      foreign: id_artist
      type: many
ArtistsHaveLinks:
  connection: doctrine
  tableName: artists_have_links
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    id_artist:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    id_links:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    url_link_artist:
      type: string(100)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    ordre:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    Artists:
      local: id_artist
      foreign: id
      type: one
    ArtistsLinks:
      local: id_links
      foreign: id
      type: one
ArtistsLinks:
  connection: doctrine
  tableName: artists_links
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    type:
      type: string(20)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    ArtistsHaveLinks:
      local: id
      foreign: id_links
      type: many
comment puis je obtenir facilement la liste des type de liens pour un artiste donné, cette liste de type ne devra pas comporté les liens qui on déjà été assigner a cet artiste. Je pense que la solution réside dans une requête imbriquée mais la je cale. Si quelqu'un pouvait m'aiguiller vers une solution je lui en serait reconnaissant.

Merci d'avance.
rib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 10h59   #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
N'avait-on pas déjà regardé et commenté ton schéma ensemble ?

Il m'a induit d'erreur ! En effet, le nom des tables est trompeur et laisse a penser à une liaison n-n sémantique entre artist et artist link. Hors le poids de la table artistHaveLink fait que cette liaison n'est pas justifiable en directe.

Je pense que tu aurais intérêt à renommer tes tables ainsi :
  • Artists -> Artist
  • ArtistsHaveLinks -> ArtistLink
  • ArtistsLinks -> LinkType
Comme d'habitude, en doctrine le nom représente un objet, pas l'ensemble, il doit donc être au singulier.


Pour ta requête, une fois la structure comprise, la solution est simple. Je vais te mettre sur la piste, si tu ne trouves pas, je te donne la solution dans la foulée.

Il faut bien voir que la requêtes part de la table ArtistsLinks vu que c'est ça que tu recherches. En fait tu veux en réponse une liste de ArtistsLinks sans les links d'un user particulier.

Donc il faut une requête qui retourne lesArtistsLinks sauf ceux qui sont dans la liste des types d'un utilisateur.

En DQL tu vas utiliser le where() et dans celui-ci une condition SQL sur "pas dans" qui est "! IN ()".

La particularité intervient ici, il faut inclure entre les parenthèses du IN une requête qui retourne les codes de l'utilisateur en question. Sauf que cette requête doit être écrite en SQL (en effet, le DQL ne peut écrire de sous requête dans une requête). Il faudra donc veiller à utiliser les nom de champs et les nom de tables défini dans la base (et pas dans le schéma), ceux-ci n'étant pas traduit. La requête ne doit retourner qu'un champ, le "id_links". A mon avis, elle ne doit être basée que sur une table.

Dans cette sous requête, tu auras un argument variable, l'Id de ton utilisateur, qui sera remplacé par un "?" qui, lui, va remonter au niveau de la méthode where() pour récupérer l'Id en question where('... IN (SELECT ... ? ...', $Id)
__________________
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 04/02/2011, 11h02   #3
rib
Membre à l'essai
 
Inscription : janvier 2005
Messages : 70
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 70
Points : 23
Points : 23
je pense avoir trouver une solution a mon probleme,
NOT IN (Select ...) dans la clause where.
doctrine permet'il de faire une soustraction entre deux doctrine collection en fonction d'un champs donné?
je m'explique:

Code :
1
2
3
4
5
6
$table = Doctrine_Core::getTable('App_Models_Artists');
$artist = $table->findOneById($id);
$link_artist = $artist->ArtistsHaveLinks;
 
$table =Doctrine_Core::getTable('App_Models_ArtistsLinks');
$link_server = $table->fetchAll();
i me faudrait qqch comme:
Code :
1
2
 
$links_a_affischer = $link_server - $link_artist
puije arriver a ce resultat en manipulant les doctrine collection($link_artist & $link_server)

ou suije obligé de passer par une requete sql imbriquée avec la clause NOT IN?
rib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 11h17   #4
rib
Membre à l'essai
 
Inscription : janvier 2005
Messages : 70
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 70
Points : 23
Points : 23
bon j'ai reussi avec cette requete sql:
Code :
1
2
SELECT type, id FROM artists_links
where id NOT IN (Select id_links FROM artists_have_links WHERE id_artist = 1)
et encore merci pour le coup de main.
rib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 11h24   #5
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


Reste a cliquer sur
__________________
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é Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web