Alléger le nombre de requêtes les éléments d'un module Symfony

De e-glop
Révision datée du 20 mai 2010 à 07:43 par BeTa (discussion | contributions) (Alléger le nombre de requêtes dans une liste d'un module Symfony déplacé vers Alléger le nombre de requêtes les éléments d'un module Symfony)

Présentation de la problématique

Un module généré par doctrine:generate-admin dans Symfony génère un nombre de requêtes important et ralentit sensiblement le fonctionnement de votre application. Vous cherchez donc à optimiser la/les requête/s générées automatiquement, quitte à mettre les mains dans le code.

Ici l'exemple portera sur une liste de prescriptions auquelles sont associées un bénéficiaire et un individu. Cet individu est lui-même rattaché à un organisme prescripteur. Le nombre de requêtes générées sans intervention est à la base de 58 pour une pagination de 20 enregistrements.

Nous souhaitons afficher, pour résumer, les informations relatives à la prescription, ainsi que celles directement liées au bénéficiaire et au prescripteur (en passant par la table Individu qui est celle rattachée à notre table Prescription originelle).

Solution

Créer une requête personnalisée optimisée

Nous allons créer une requête permettant de retrouver l'ensemble des champs nécessaires à l'affichage de la liste, dans la classe PrescriptionTable du modèle. Ainsi dans le fichier lib/model/doctrine/PrescriptionTable.class.php :

 (...)
 public function retrieveInformationsForListing(Doctrine_Query $q)
 {
   $rootAlias = $q->getRootAlias();
   $q->leftJoin($rootAlias . '.Individu i')
     ->leftJoin('i.Prescripteur') 
     ->leftJoin($rootAlias . '.Beneficiaire b');
   return $q;
 }
 (...)

Déclaration de cette méthode dans le generator.yml

Il est maintenant nécessaire de déclarer l'utilisation de cette méthode au moment de la construction de la liste. Pour se faire, ajouter la ligne suivante dans le fichier apps/backend/modules/prescription/config/generator.yml :

 (...)
 config:
     list:
       title: Liste des prescriptions
       display: [=Beneficiaire, prescripteur]
       table_method: retrieveInformationsForListing
 (...)

Conclusion

Pour vérifier l'efficacité de notre solution, rechargeons la liste des prescriptions : nous sommes passé de 58 requêtes à 7 requêtes, et à un temps d'exécution proportionnel... CQFD.

Webographie