Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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
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):
[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
Hors ligne
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é .
Hors ligne
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
Dernière modification par JGreco (12-05-2014 16:50:18)
Hors ligne
Pages: 1