Laravel : lister toutes les requêtes d’une transaction SQL avec DB::listen()

Lorsqu’une transaction SQL devient complexe, il est parfois difficile de comprendre précisément quelles requêtes sont exécutées et dans quel ordre. Laravel permet d’écouter toutes les requêtes SQL grâce à la méthode DB::listen().

  • d’analyser les requêtes réellement exécutées,
  • de mesurer leur temps d’exécution,
  • de détecter des requêtes inutiles ou trop lentes,
  • d’optimiser les performances de l’application.

Exemple d’écoute des requêtes dans une transaction

$queries = []; 

DB::listen(function ($query) use (&$queries) { 
    $queries[] = [ 
        'sql' => $query->sql, 
        'bindings' => $query->bindings, 
        'time_ms' => $query->time, 
    ]; 
}); 

try { 
    DB::beginTransaction(); 

    // Exécuter ici les requêtes à analyser 
    User::get(); 
    Post::where('active', true)->get(); 

    DB::commit(); 
} catch (\Exception $e) { 
    DB::rollBack(); 
    throw $e; 
} 

// Affichage des requêtes 
foreach ($queries as $i => $q) { 
    echo "#{$i} ({$q['time_ms']} ms) {$q['sql']}"; 
    echo "Bindings : " . json_encode($q['bindings'], JSON_UNESCAPED_UNICODE); 
} 
Langage du code : PHP (php)

Résultat obtenu :

  • la requête SQL brute,
  • les paramètres (bindings),
  • le temps d’exécution en millisecondes.

Attention : DB::listen() ne doit pas être utilisé en production, car il intercepte toutes les requêtes SQL et peut fortement impacter les performances.
Il est recommandé de l’activer uniquement en environnement local :

if (app()->environment('local')) { 
    DB::listen(function ($query) { 
        logger()->info($query->sql, $query->bindings); 
    }); 
}
Langage du code : PHP (php)

Astuce : reconstruire la requête SQL complète

Pour afficher la requête SQL avec les valeurs réelles des paramètres :

$sql = vsprintf(str_replace('?', '%s', $query->sql), $query->bindings); 
echo $sql;
Langage du code : PHP (php)

Conclusion

L’utilisation de DB::listen() est un excellent outil pour comprendre ce qui se passe réellement dans une transaction SQL. Il permet de :

  • déboguer des comportements inattendus,
  • optimiser les performances,
  • visualiser les requêtes cachées générées par l’ORM.

C’est une méthode simple mais très puissante pour analyser les requêtes SQL dans Laravel.

GhostvOne
GhostvOne

Laisser un commentaire

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