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 30/08/2011, 20h08   #1
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 38
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 38
Points : 16
Points : 16
Par défaut Requête DQL au comportement étrange

Bonjour à tous,

Je rencontre actuellement un soucis avec une requête DQL.

Je cherche à afficher les pôles auxquels un membre appartient, mais pour une raison que j'ignore, une seule ligne s'affiche sur ma page.

Tout d'abord, voici le script SQL de création des 2 tables :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE IF NOT EXISTS `membres_poles_postes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `membres` int(11) DEFAULT NULL,
  `poles` int(11) DEFAULT NULL,
  `poste` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_MEMBRES_POLES_1` (`membres`),
  KEY `FK_MEMBRES_POLES_2` (`poles`),
  KEY `FK_MEMBRES_POLES_3` (`poste`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
 
 
CREATE TABLE IF NOT EXISTS `poles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

Voici maintenant la requête DQL que j'effectue :

Code :
1
2
3
4
5
6
<?
$polespostes = Doctrine_Query::create()
			->select('p.nom AS nomPole')
			->from('Poles p')
			->innerJoin('p.MembresPolesPostes m WITH m.membres = ?', $this->getUser()->getAttribute('id'))
			->execute();
La requête SQL générée d'après le fichier de log est la suivante :

Code :
SELECT p.nom AS p__0 FROM poles p INNER JOIN membres_poles_postes m ON p.id = m.poles AND (m.membres = 1)
Ce qui me donne comme résultat dans MYSQL :

p__0
Technique
Espoir

Or, sur ma page web, seul "Technique" s'affiche.

Pour exploiter mon résultat, j'utilise une boucle foreach().

Je ne pense pas exploiter de manière incorrecte mon résultat car sur une requête plus simple, tout s'affiche, par exemple avec cette requête DQL :

Code :
1
2
3
4
5
<?php
$polespostes = Doctrine_Query::create()
			->select('p.nom AS nomPole')
			->from('Poles p')
			->execute();
La requête SQL générée est :

Code :
SELECT p.nom AS p__0 FROM poles p
Ce qui me donne les résultats suivant dans MySQL :

p__0
Séniors
Juniors
Espoir
Technique
Pédagogie
Communication
Bureau

et je retrouve bien tous ces résultats sur ma page internet.

Ce que je trouve vraiment étrange, c'est que lorsque je place un compteur dans ma boucle foreach() exploitant les résultats avec un compteur, celui-ci n'est pas incrémenté, comme si la première requête me renvoyait uniquement une ligne, hors, l'exécution dans MySQL montre le contraire.

Si quelqu'un arrive à voir l'origine du problème, je suis preneur !

Merci d'avance pour votre aide !

Wapiti89
wapiti89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 19h14   #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
Tu pars a priori sur un mauvais pied. En effet, tu parts d'une base préexistante (depuis laquel tu vas certainement générer ton shema.yml).

Hors ceci ne doit être utilisé que s'il n'est vraiment pas envisageable de faire autrement. L'idéal consiste à créer un shema.yml correcte et de l'utiliser pour générer entre autre la base. En effet, le shema.yml va décrire la base mais il va aussi décrire le fonctionnement des entités (table du côté de doctrine) et les relations entre les entités.

Mets ton shema.yml on va voir comment l'optimiser pour ta base, tes requête en découleront naturellement.
__________________
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 09/09/2011, 01h26   #3
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 38
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 38
Points : 16
Points : 16
Bonsoir et merci de ton intérêt !

Comme demandé, voici mon schéma yaml pour les 2 tables citées dans mon premier post :

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
 
MembresPolesPostes:
  connection: doctrine
  tableName: membres_poles_postes
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    membres:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    poles:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    poste:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    Membres:
      local: membres
      foreign: id
      type: one
    Poles:
      local: poles
      foreign: id
      type: one
    Postes:
      local: poste
      foreign: id
      type: one
 
Poles:
  connection: doctrine
  tableName: poles
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    nom:
      type: string(255)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    MembresPolesPostes:
      local: id
      foreign: poles
      type: many
    Pave:
      local: id
      foreign: pole
      type: many
wapiti89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 22h09   #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
C'est un peu ce que je craignais, ton shema est manifestement la récupération brute de celui d'une base pré-existante. C'est la moins bonne manière de commencer une application, à ne faire que s'il n'est réellement pas possible de faire autrement (base existante et qui ne peut être modifiée). Dans ce cas, la seul récupération du shema.yml ne peut suffire, il doit servir de support et être presque entièrement réécrit.

Le bout de ton code "à ma façon"
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
 
MembrePolePoste: #toujours au singulier
  tableName: membres_poles_postes #là tu mets ce que tu veux
  columns: 
    # id autogénéré
    membre_id: # je suppose une clef de liaison, jamais de pluriel
      type: integer
    pole_id: # je suppose une clef de liaison
      type: integer
    poste_id: #idem
      type: integer  
    Membre: # je suppose relations-n d'ici, rien sur la table liée
      foreignAlias: MembrePolePostes #Un pluriel pour marqué qu'il y a plusieur MPPs pour un Membre
    Pole:
      foreignAlias: MembrePolePostes
    Poste:
      foreignAlias: MembrePolePostes
 
Pole:
  tableName: poles
  columns:
    nom:
      type: string(255)
# les relations doivent ici être décris sur l'autre table.
Je pense que tes difficultés proviennent de la double écriture des relations.

Travail sur un shema.yml et génère ta base depuis ce dernier, c'est la meilleur (seul) méthode.
__________________
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 21h29.


 
 
 
 
Partenaires

Hébergement Web