Para un ciclo de vida de solicitud HTTP, puede habilitar el registro de consultas en el handlemétodo de algún BeforeAnyDbQueryMiddlewaremiddleware y luego recuperar las consultas ejecutadas en el terminatemétodo del mismo middleware.
classBeforeAnyDbQueryMiddleware{publicfunction handle($request,Closure $next){
DB::enableQueryLog();return $next($request);}publicfunction terminate($request, $response){// Store or dump the log data...
dd(
DB::getQueryLog());}}
La cadena de un middleware no se ejecutará para comandos artesanales, por lo que para la ejecución de CLI puede habilitar el registro de consultas en artisan.start detector de eventos.
Por ejemplo, puedes ponerlo en el bootstrap/app.phparchivo
Laravel guarda todas las consultas en la memoria. Por lo tanto, en algunos casos, como cuando se inserta una gran cantidad de filas o se realiza un trabajo de larga duración con muchas consultas, esto puede hacer que la aplicación use un exceso de memoria.
En la mayoría de los casos, necesitará el registro de consultas solo para la depuración, y si ese es el caso, recomendaría que lo habilite solo para el desarrollo.
if(App::environment('local')){// The environment is local
DB::enableQueryLog();}
Si su sistema usa más de una conexión db, debe especificarla, de lo contrario podría devolver una matriz vacía:\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
Cómo habilitarlo para registrar Eloquent "NameController :: create ();" ¿declaración?
Rubén Ruíz
2
Tenga en cuenta que en Laravel 5.4 la DB::listenfunción de devolución de llamada tiene una firma diferente. Es más así: DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
racl101
45
Si todo lo que realmente le importa es la consulta real (la última ejecución) para fines de depuración rápida:
DB::enableQueryLog();# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query'];# <-------# optionally disable the query log:
DB::disableQueryLog();
haz un print_r()encendido $laQuery[0]para obtener la consulta completa, incluidos los enlaces. (la $lcWhatYouWantvariable anterior tendrá las variables reemplazadas por ??)
Si está usando algo diferente a la conexión principal de mysql, deberá usar estos en su lugar:
¿A dónde va este código? (5.4) He probado el controlador, el modelo y busqué en el middleware, no estoy seguro de dónde ejecutarlo antes de obtener el error de db.
blamb
Si recibe un error al ejecutar la consulta que detiene la ejecución, el error debería indicarle cuál es el problema. Si tiene los errores desactivados, puede verificar el error de inicio de sesión / almacenamiento / registro / laravel o algo así. (No estoy en mi computadora en este momento) Si está diciendo que está recibiendo un error al ejecutar el código que sugerí en mi respuesta, asegúrese de incluir la fachada de la base de datos donde sea que esté ejecutando el código. No estoy seguro de lo que está tratando de hacer, pero el controlador parece la opción más correcta que mencionó. (Normalmente ejecuto consultas en clases de ayuda separadas)
Skeets
15
Primero debe habilitar el registro de consultas
DB::enableQueryLog();
Luego puede obtener registros de consultas simplemente:
dd(DB::getQueryLog());
Sería mejor si habilita el registro de consultas antes de que comience la aplicación, lo que puede hacer en un BeforeMiddleware y luego recuperar las consultas ejecutadas en AfterMiddleware.
Un poco sucio, pero +1 para las consultas $ query-> bindings y $ query-> time
Paolo Stefan
¡Ordenado! ¡Usar esto muestra los resultados en la vista, justo donde está ocurriendo la consulta!
Charles Wood
11
Aparentemente con Laravel 5.2, el cierre DB::listensolo recibe un único parámetro.
Entonces, si desea usar DB::listenen Laravel 5.2, debe hacer algo como:
DB::listen(function($sql){// $sql is an object with the properties:// sql: The query// bindings: the sql query variables// time: The execution time for the query// connectionName: The name of the connection// To save the executed queries to file:// Process the sql and the bindings:foreach($sql->bindings as $i => $binding){if($binding instanceof \DateTime){
$sql->bindings[$i]= $binding->format('\'Y-m-d H:i:s\'');}else{if(is_string($binding)){
$sql->bindings[$i]="'$binding'";}}}// Insert bindings into query
$query = str_replace(array('%','?'), array('%%','%s'), $sql->sql);
$query = vsprintf($query, $sql->bindings);// Save the query to file
$logFile = fopen(
storage_path('logs'. DIRECTORY_SEPARATOR . date('Y-m-d').'_query.log'),'a+');
fwrite($logFile, date('Y-m-d H:i:s').': '. $query . PHP_EOL);
fclose($logFile);});
useMonolog\Logger;useMonolog\Handler\StreamHandler;
$log =newLogger('sql');
$log->pushHandler(newStreamHandler(storage_path().'/logs/sql-'. date('Y-m-d').'.log',Logger::INFO));// add records to the log
$log->addInfo($query, $data);
Es una mala idea editar vendorarchivos. Deben mantenerse originales.
shukshin.ivan
@ shukshin.ivan Sí, uno no debe editar archivos de proveedores, pero para obtener la consulta exacta, hemos editado este código por el momento y luego podemos volver a cambiarlo.
Respuestas:
De manera predeterminada, el registro de consultas está deshabilitado en Laravel 5: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
Deberá habilitar el registro de consultas llamando a:
o registre un oyente de eventos:
Algunos consejos
1. Múltiples conexiones DB
Si tiene más de una conexión de base de datos, debe especificar qué conexión registrar
Para habilitar el registro de consultas para
my_connection
:Para obtener el registro de consultas para
my_connection
:2. ¿Dónde habilitar el registro de consultas?
Para un ciclo de vida de solicitud HTTP, puede habilitar el registro de consultas en el
handle
método de algúnBeforeAnyDbQueryMiddleware
middleware y luego recuperar las consultas ejecutadas en elterminate
método del mismo middleware.La cadena de un middleware no se ejecutará para comandos artesanales, por lo que para la ejecución de CLI puede habilitar el registro de consultas en
artisan.start
detector de eventos.Por ejemplo, puedes ponerlo en el
bootstrap/app.php
archivo3. Memoria
Laravel guarda todas las consultas en la memoria. Por lo tanto, en algunos casos, como cuando se inserta una gran cantidad de filas o se realiza un trabajo de larga duración con muchas consultas, esto puede hacer que la aplicación use un exceso de memoria.
En la mayoría de los casos, necesitará el registro de consultas solo para la depuración, y si ese es el caso, recomendaría que lo habilite solo para el desarrollo.
Referencias
fuente
\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
DB::listen
función de devolución de llamada tiene una firma diferente. Es más así:DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
Si todo lo que realmente le importa es la consulta real (la última ejecución) para fines de depuración rápida:
haz un
print_r()
encendido$laQuery[0]
para obtener la consulta completa, incluidos los enlaces. (la$lcWhatYouWant
variable anterior tendrá las variables reemplazadas por??
)Si está usando algo diferente a la conexión principal de mysql, deberá usar estos en su lugar:
(con su nombre de conexión donde está "mysql2")
fuente
Primero debe habilitar el registro de consultas
Luego puede obtener registros de consultas simplemente:
Sería mejor si habilita el registro de consultas antes de que comience la aplicación, lo que puede hacer en un BeforeMiddleware y luego recuperar las consultas ejecutadas en AfterMiddleware.
fuente
Pon esto en el archivo routes.php:
Enviado por msurguy, código fuente en esta página . Encontrará este código de corrección para laravel 5.2 en los comentarios.
fuente
Aparentemente con Laravel 5.2, el cierre
DB::listen
solo recibe un único parámetro.Entonces, si desea usar
DB::listen
en Laravel 5.2, debe hacer algo como:fuente
Para laravel 5.8 solo agrega dd o dump .
Ex:
o
referencia: https://laravel.com/docs/5.8/queries#debugging
fuente
Use en
toSql()
lugar deget()
así:fuente
(Laravel 5.2) Creo que la forma más simple es simplemente agregar una línea de código para monitorear las consultas sql:
fuente
Continuando con Aparentemente con Laravel 5.2, el cierre en DB :: listen solo recibe un solo parámetro ... respuesta anterior: puede poner este código en el script de Middleware y usarlo en las rutas.
Adicionalmente:
fuente
Este código es para:
Aquí está el código, que se basa en la respuesta de @milz:
El núcleo es la
if(stripos...
línea, que evita la recurrencia de insertar lainsert into log
instrucción sql en la base de datos.fuente
Creo que la respuesta se encuentra en este artículo: https://arjunphp.com/laravel-5-5-log-eloquent-queries/
Es rápido y sencillo lograr el registro de consultas.
Sólo tienes que añadir a la
AppServiceProvider
delboot
método de devolución de llamada para escuchar a las consultas de base de datos:fuente
Suponga que desea imprimir la consulta SQL de las siguientes declaraciones.
Solo necesita hacer lo siguiente:
Esto imprimirá la última consulta ejecutada en Laravel.
fuente
Para laravel 5 y en adelante usando solo DB :: getQueryLog (), no funcionará. Por defecto en esto el valor de
cámbielo a
en el archivo a continuación para la consulta de registro.
Y luego podemos usar el lugar
DB::getQueryLog()
donde desea imprimir la consulta.fuente
vendor
archivos. Deben mantenerse originales.