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 :

Requête DQL au comportement étrange


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  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
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Par défaut
    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 : 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
     
    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

  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
    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 : 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
     
    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.

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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