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 :

Jointure et collection d'objet


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 24
    Par défaut Jointure et collection d'objet
    Bonjour
    En voulant économiser des requêtes, je me suis lancé dans une jointure de ce genre :

    un utilisateur à plusieurs livres présent dans sa bibliothèque (j'ai une table livre, et une table bibliothèque faisant le lien entre un user et ses livres).

    Je veux donc que quand je fasse un getBibliotheque sur le user, je ne sois pas ensuite obligé de faire un getLivre sur chacun des objets de la collection renvoyée (vu que doctrine me refait une requête à chaque fois)...

    D'où la jointure toute bête entre les deux
    Doctrine_query::create()
    ->from('Bibliotheque b')
    ->where('b.id_user != ?', $this->getUserId())
    ->leftJoin('b.Livre l');
    La requête marche bien, j'économise 80% des requetes sur ma page...
    Sauf que je ne pige pas bien comment reconstituer les collections d'objets "bibliothèque" et "livre" correspondant...
    Là ça me renvoie des résultats sous forme de tableau mais ca ne créé par les objets correspondant... Je suis obligé de les créer à la main?

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Qu'utilise tu pour exécuter la requête ?
    Si tu fais un , tu auras des objets.
    Ces objets seront composés de deux autres objets : un pour chacune des tables.
    Ainsi, tu pourras récupérer les objets de chaque table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    foreach($biblioLivres as $biblioLivre){
       $biblio = $biblioLivre->getBibliotheque();
       $livre = $biblioLivre->getLivre();
    }
    Ton problème est le même qu'ici :http://www.developpez.net/forums/d92...uete-doctrine/

  3. #3
    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
    En fait, le fait de faire une requête qui retourne des informations de plusieurs tables, ne change pas la manière d'accéder aux données (quoique).

    Dans le cas classique, tu vas continuer a parcourir les user dans un $user et pour chaque $user tu auras un $user->getLivres() qui va te retourner un Doctrine_collection avec les objets livres de l'utilisateur. Seul différence, tu n'as qu'une requête envoyée au moteur SGBD donc une économie de requête.

    Par contre, en changeant la méthode d'hydratation de la requête, tu dois pouvoir y accéder plus rapidement. Mais là, faut que tu creuses, c'est un système que je ne maitrise pas.

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

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

    Juste pour te donner une idée de l'objet que renvoi Doctrine mais en plus simple, tu peux hydrater (comme le dit mimi) différemment.
    De base, une requête lancée avec un execute() hydrate les données en objets. Très utile mais très gourmand en ressources et impossible à printer correctement.

    L'idéal quand on ne fait que de l'affichage et quand, du coup, on a pas besoin de retravailler les données, c'est d'hydrater les données en array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Doctrine_query::create()
      ->from('Bibliotheque b')
      ->where('b.id_user != ?', $this->getUserId())
      ->leftJoin('b.Livre l')
      ->execute(array(), Doctrine::HYDRATE_ARRAY);
    Print_r le résultat et tu comprendra mieux la logique de Doctrine.

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/03/2006, 09h22
  2. Problème de gestion d'une collection d'objet
    Par poolky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/02/2006, 21h51
  3. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11
  4. Probléme collection d'objets
    Par Contrec dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 10h08
  5. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58

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