Sigo investigando Laravel 8 y buscando funcionalidad a la que estoy acostumbrado en otros frameworks. Vengo del mundo de C++ y Java, por lo que me tengo que adaptar e investigar cómo resolver en este framework de PHP los problemas comunes que voy encontrando.
Uno de ellos es saber exactamente qué query está ejecutando el framework. Eloquent parece bastante potente pero soy poco amigo de dejar hacer demasiadas cosas al framework y me gusta siempre tener el control, o por lo menos, saber exactamente qué está haciendo «por debajo». Muy recomendable el artículo «Odio los frameworks» del grandísimo Javi Santana para saber de qué estoy hablando.
Así que, continuando con la anterior entrada en la que customizaba los logs de Laravel, en este caso quiero ver en traza qué query está ejecutando en cada momento.
Para ello, se puede añadir un Listener de base de datos y el lugar más sencillo es en la configuración de los Service Providers:
app/Providers/AppServiceProviders.php
public function boot() {
/*ADD THIS LINES*/
$this->commands([
InstallCommand::class,
ClientCommand::class,
KeysCommand::class,
]);
if ($this->app->environment('local')) {
DB::listen(function($query) {
Log::info('Query: ' . $query->sql . PHP_EOL);
Log::info($query->bindings);
});
}
}
Con esto, conseguimos mostrar en traza qué queries está ejecutando mostrando:
- La query que se ejecuta
- Con qué variables («bindings«) se están utilizando en la query, es decir, qué valor sustituye cada uno de los caracteres «?».
storage/logs/laravel.log
[2021-04-21 21:45:19.776] Query: select * from `oauth_clients` where `id` = ? limit 1
[2021-04-21 21:45:19.776] array ( 0 => '1', )
Es decir, la query que se ha ejecutado es:
select * from `oauth_clients` where `id` = '1' limit 1
Bastante sencillo, aunque me ha llevado bastante tiempo de búsquedas en Google. En principio, no es una configuración a llevar a producción ya que la escritura en traza suele ser bastante costosa, pero al menos en desarrollo va a ser muy útil.
Deja una respuesta