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

ORM PHP Discussion :

Lire les résultats d'une requête Doctrine


Sujet :

ORM PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 50
    Points : 35
    Points
    35
    Par défaut Lire les résultats d'une requête Doctrine
    Bonjour,

    Je ne suis pas sûr de poster sur le bon forum.

    Je suis dans le cadre du tutorial Jobeet de symfony.

    Je voulais tester une requête de type LEFT JOIN pour m'entraîner.

    La requête, dans un fichier JobeetAffiliate.class.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public function getCategories()
    	{
    		$q = Doctrine_Query::create()
    		 ->select('a.id , b.name')
    		 ->from('JobeetAffiliate a')
    		 ->leftJoin('a.JobeetCategories b');
    		return $q->execute();
    	}
    La vue dans un fichier showSuccess.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        <?php foreach ($jobeet_affiliate->getCategories() as $c): ?>
    	<tr>
          <td><?php echo $c->name ?></td>
        </tr>
    	<?php endforeach; ?>
    J'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
    Unknown record property / related component "name" on "JobeetAffiliate"
    Visiblement, j'arrive pas à récupérer la colonne "name". La requête est juste, elle me renvoie :

    j__id j2__id j2__name
    1 5 Design
    1 7 Manager
    2 7 Manager

    Je pense que je me trompe dans la méthode d'accès aux résultats de la requête, qu'en pensez-vous?

  2. #2
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    Bonjour,

    Etant une table jointe, tu dois récupérer la valeur en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $c->JobeetCategories->name
    Enfin, je n'ai plus la valeur exacte en tête, c'est quelque chose comme cela

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 50
    Points : 35
    Points
    35
    Par défaut
    En faisant ce que tu dis, l'erreur disparaît, mais aucune valeur est retournée.

    Que je comprenne bien, dans le code ci-dessous :
    <?php foreach ($jobeet_affiliate->getCategories() as $c): ?>
    <tr>
    <td>categorie : <?php echo $c->JobeetCategories->id ?></td>
    </tr>
    <?php endforeach; ?>
    On a :
    • $jobeet_affiliate : c'est un object JobeetAffiliate qui a été instancié dans l'action executeShow(...)
    • getCategories() : c'est une fonction que j'ai écritre dans la classe JobeetAffiliate. cette fonction retourne un Doctrine_Collection qui devrait avoir les données résultant de la requête (3 enregistrements que je vous ai collé avant)
    • $c est un élément du Doctrine_Collection


    Or ma boucle me ramène juste 2 enregistrements!!

    Il y a un truc que je ne saisis pas...

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Ton code de départ est "presque" le bon...

    Juste une remarque qui n'a rien a voir avec l'erreur mais qui me semble importante pour quelqu'un qui commence.

    Tu mets dans ton template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        <?php foreach ($jobeet_affiliate->getCategories() as $c): ?>
    	<tr>
          <td><?php echo $c->name ?></td>
        </tr>
    	<?php endforeach; ?>
    Hors, il ne faudrait pas avoir dans la partie visuel une appel qui devrait être dans le contrôleur.

    Et donc avoir dans le contrôleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->Categories = $this->jobeet_affiliate->getCategories();
    et dans le template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        <?php foreach ($Categories as $c): ?>
    	<tr>
          <td><?php echo $c->name ?></td>
        </tr>
    	<?php endforeach; ?>
    Avantage, le jour ou la personne qui travail sur le template est plus graphiste que développeur, il ne sera pas perturber par du code intempestif.

    reste a récupérer le nom, plusieurs solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php echo $c->getName() ?>
    <?php echo $c['name'] ?>
    <?php echo $c->get('name') ?>
    Je crois qu'il y en a une quatrième, mais je ne m'en rappelle plus.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 50
    Points : 35
    Points
    35
    Par défaut
    Merci pour cette bonne pratique que je vais immédiatement mémoriser!

    Bon, je continue à m'arracher les cheveux. J'ai débuggé un peu le terrain et je ne comprends pas un truc :

    La requête exécutée me renvoie bien ce que je veux :
    j__id j__email
    2 v@deuxieme.com
    1 v@perso.fr
    1 v@perso.fr

    Mais quand je parcours cette collection, il ne voit que 2 éléments, un peu comme s'il ne comptait pas les doublons.

    Une autre étrangeté : un count() me donne 7 éléments!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 50
    Points : 35
    Points
    35
    Par défaut
    Trouvé!!

    En fait, quand on fait une requête avec un leftJoin, l'objet retourné ne se présenta pas simplement. Il s'agit d'un espèce de truc imbriqué.

    Pour accéder à chaque élément, il faut faire comme le suggérait sacriri. Mais j'avais pas réfléchi : dans ma proposition de code, je cherche d'id directement dans la collection des JobeetCategories! En fait, il faut faire deux boucles imbriquée.

    Le code est le suivant, il est très très moche, mais il fonctionne dans le principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $aff=$jobeet_affiliate->getCategories();
    foreach ( $aff as $a)
    {
    	echo $a->email;
    	echo "<br/>";
    	foreach ($a->JobeetCategories as $c)
    	{
    		echo "cat";
    		echo $c->id;
    		echo "<br/>";
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Effacer les résultats d'une requête
    Par Nutrino dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/11/2006, 21h54
  2. [SQL] Afficher les résultats d'une requête sur plusieurs pages
    Par mealtone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/09/2006, 13h20
  3. Transformer les résultats d'une requête dans un autre ordre
    Par keikun dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/04/2006, 16h29
  4. Limiter les résultats d'une requête à \today\' - n jours
    Par Eddy Duflos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/10/2005, 08h46
  5. [JDBC] Stocker les résultats d'une requête
    Par etiennegaloup dans le forum JDBC
    Réponses: 9
    Dernier message: 26/07/2005, 18h18

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