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.