[Symfony] Réduire le nombre de requêtes dans l’admin générator

Bonjour,

En regardant la liste des blogs parlant de Symfony cette semaine, je suis tombé sur 2 posts de blogs (sur symfony-world et sur fizyk.net) qui m’ont intéressés. Ils abordent tous les 2 un points que l’on est vite amené à rencontrer lorsque l’on commencer à utiliser l’admin-generator : la multiplication des requêtes.

Trop de requêtes dans l’admin generator.

Prenons comme exemple une donnée qui pourrait être typée. Voici le schema.yml que l’on aurait :

DataType:
  actAs:
    Timestampable: ~
  columns:
    name:               varchar(255)
Data:
  actAs:
    Timestampable: ~
  columns:
    name:               varchar(255)
    type_id:            integer
  relations:
    Type:
      class:            DataType
      local:            type_id
      foreign:          id

On a donc une relation simple. Générons notre admin après avoir créé une fixtures avec une dizaine de data et 5 type de data.

./symfony doctrine:generate-admin admin Data

On va maintenant modifier le generator.yml pour afficher le nom de la donnée et son type (il y a donc une jointure). Le simple fait d’afficher le type de la donnée, va rajouter un nombre conséquent de jointures. On passe de 4 requêtes (cf image 1) à 15 requêtes (4 de base + 1 par data, cf image 2). L’image 3 montre la liste obtenue.

Image 1
Image 2
Image 3

On a donc beaucoup plus de requêtes rien qu’avec une simple jointure, alors imaginez les admins generators pour des tables ayant plusieurs jointures…

Réduire le nombre de requêtes simplement.

Heureusement, il est possible de surcharger facilement cela grâce aux options du generator.yml. Dans notre generator.yml, on va donc spécifier l’option suivante :

config:
 actions: ~
 fields:  ~
 list:
 display:      [id, name, Type]
 table_method: getWholeData

Il ne nous reste plus qu’à définir la fonction getWholeData() dans le fichier DataTable.class.php :

public static function getWholeData()
{
  $q = self::getInstance()->createQuery('d');
  $q->leftJoin($q->getRootAlias().'.Type t');

  return $q->execute();
}

Un petit symfony cc pour vider le cache et le tour est joué ! Désormais, au lieu d’exécuter 15 requêtes, l’admin generator n’en execute que 5. Et c’est tout (cf image 4).

Image 4

Cette méthode simple permet ainsi de diminuer grandement le nombre de requêtes générées par l’admin generator. Préférez cette méthode à toute surcharge du buildQuery présent dans l’action.class.php de votre modèle.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *