Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-05-2014 11:34:11

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Doctrine optimiser la récupération des données des collections

Bonjour,

Dans le cadre de mon projet je récupère des collections. Ces collections sont des données issue d'une table dans laquelle une clé étrangère renvoi donc à une autre entité.

mon findBy opère déjà donc un select et renvoi un résultat sous cette forme

Code:

array =>
    0 => object monEntiteA
      //mes valeurs...
      'foreignKey' => object monEntiteB

Dans la vue, je fait un foreach sur cette array et je recupère avec mes getters chaque variables

toutefois pour récupérer mes valeurs de l'entite B je fais (a l'intérieur de mon foreach):

Code:

[lang=php]
foreach ($EntiteA as $key=>$val)
{
  $val->getForeignKey()->getMaValeurForeignKey();
}

Toutefois j'ai via cette méthode (getMaValeurForeignKey) une requete supplémentaire doctrine, est-ce exacte ?

Car il se peut aussi que mon EntiteB contienne également une clé étrangère faisant référence à une EntiteC.
Mon exemple dans ce cas précis est pour afficher 8 lignes ainsi que les informations relative à ces 8 lignes présentes dans d'autre entité. Le tout me génère 20 requêtes doctrine.
En local cela va assez vite (quelques MS, selon les informations de Zend DevelopperTools);
Dans un contexte de production, je suis quasi sur que ces lignes seront de l'ordre d'une 100aine, et j'ose à peine imaginer le nombre de requête que doctrine devra effectuer...

Est-ce que j'ai procédé de la bonne manière pour accéder à ces données ? Si non, pouvez vous m'aiguiller sur la bonne méthode à adopter pour avoir les données que je désire sans forcément lancer une requête supplémentaire.

Je ne sais pas si c'est clair, si non hésitez pas à demander plus d'infos. Merci smile


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#2 12-05-2014 16:03:42

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine optimiser la récupération des données des collections

Salut,

j'imagine que pour récupérer ta collection tu fais un findAll sur l'entity manager ? Dans ce cas il va donc récupérer tout le contenu de ta table dans une collection et indiquer des références vers les tables de jointures et si jamais tu appels l'attribut de la jointure il va faire une requête (lazyloading) mais du coup il en fera une pour chaque objet de ta collection. Le plus simple c'est dans le mapping de ton modèle d'indiquer au niveau de la jointure un fetch="EAGER" lorsque tu veux récupérer le contenu de la jointure en même temps que la collection. De cette façon il fera un join au lieu de faire une nouvelle requête.
Tu peux aussi écrire ta propre requête en DQL avec la jointure et les tables que tu veux pour les cas spécifiques.

Pour te donner un exemple concret on peux imaginer une table utilisateur qui a une jointure vers la table profil. Tu sais qu'à chaque fois que tu vas vouloir récupérer l'utilisateur tu voudras récupérer le profil dans ce cas tu mets le fetch="EAGER" dans la mapping et c'est réglé wink.

Hors ligne

 

#3 12-05-2014 16:27:49

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Doctrine optimiser la récupération des données des collections

Salut en effet je viens de voir sur doctrine le fetch EAGER c'est en réalité la jointure, je m'étonnais en effet de ne pas voir de jointure dans mes sous entités lors du var_dump il mettait a null les valeur jusqu'a ce que je demande les get... du coup un autre Select...

j'ai aussi vu  fetch="EXTRA_LAZY"
quelle différence  avec EAGER ? c'est le fait de charger le contenu des sous-entités comme tu me le disais dans ta réponse ?

Merci en tous cas pour ta réponse c'est très complet smile

Dernière modification par JGreco (12-05-2014 16:50:18)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages