Estoy tratando de ver el registro de una consulta, pero DB::getQueryLog()
solo estoy devolviendo una matriz vacía:
$user = User::find(5);
print_r(DB::getQueryLog());
Resultado
Array
(
)
¿Cómo puedo ver el registro de esta consulta?
Estoy tratando de ver el registro de una consulta, pero DB::getQueryLog()
solo estoy devolviendo una matriz vacía:
$user = User::find(5);
print_r(DB::getQueryLog());
Resultado
Array
(
)
¿Cómo puedo ver el registro de esta consulta?
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:
DB::enableQueryLog();
o registre un oyente de eventos:
DB::listen(
function ($sql, $bindings, $time) {
// $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1
// $bindings - [5]
// $time(in milliseconds) - 0.38
}
);
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
:
DB::connection('my_connection')->enableQueryLog();
Para obtener el registro de consultas para my_connection
:
print_r(
DB::connection('my_connection')->getQueryLog()
);
Para un ciclo de vida de solicitud HTTP, puede habilitar el registro de consultas en el handle
método de algún BeforeAnyDbQueryMiddleware
middleware y luego recuperar las consultas ejecutadas en el terminate
método del mismo middleware.
class BeforeAnyDbQueryMiddleware
{
public function handle($request, Closure $next)
{
DB::enableQueryLog();
return $next($request);
}
public function 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.php
archivo
$app['events']->listen('artisan.start', function(){
\DB::enableQueryLog();
});
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();
}
Referencias
\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:
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 $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:
DB::connection("mysql2")->enableQueryLog();
DB::connection("mysql2")->getQueryLog();
(con su nombre de conexión donde está "mysql2")
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.
Pon esto en el archivo routes.php:
\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
echo'<pre>';
var_dump($query->sql);
var_dump($query->bindings);
var_dump($query->time);
echo'</pre>';
});
Enviado por msurguy, código fuente en esta página . Encontrará este código de corrección para laravel 5.2 en los comentarios.
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:
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);
}
);
Para laravel 5.8 solo agrega dd o dump .
Ex:
DB::table('users')->where('votes', '>', 100)->dd();
o
DB::table('users')->where('votes', '>', 100)->dump();
referencia: https://laravel.com/docs/5.8/queries#debugging
Use en toSql()
lugar de get()
así:
$users = User::orderBy('name', 'asc')->toSql();
echo $users;
// Outputs the string:
'select * from `users` order by `name` asc'
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:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('sql');
$log->pushHandler(new StreamHandler(storage_path().'/logs/sql-' . date('Y-m-d') . '.log', Logger::INFO));
// add records to the log
$log->addInfo($query, $data);
Este código es para:
Aquí está el código, que se basa en la respuesta de @milz:
DB::listen(function($sql) {
$LOG_TABLE_NAME = 'log';
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);
if(stripos($query, 'insert into `'.$LOG_TABLE_NAME.'`')===false){
$toLog = new LogModel();
$toLog->uId = 100;
$toLog->sql = $query;
$toLog->save();
}
});
El núcleo es la if(stripos...
línea, que evita la recurrencia de insertar la insert into log
instrucción sql en la base de datos.
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
del boot
método de devolución de llamada para escuchar a las consultas de base de datos:
namespace App\Providers;
use DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
DB::listen(function($query) {
logger()->info($query->sql . print_r($query->bindings, true));
});
}
}
Suponga que desea imprimir la consulta SQL de las siguientes declaraciones.
$user = User::find(5);
Solo necesita hacer lo siguiente:
DB::enableQueryLog();//enable query logging
$user = User::find(5);
print_r(DB::getQueryLog());//print sql query
Esto imprimirá la última consulta ejecutada en Laravel.
Para laravel 5 y en adelante usando solo DB :: getQueryLog (), no funcionará. Por defecto en esto el valor de
protected $loggingQueries = false;
cámbielo a
protected $loggingQueries = true;
en el archivo a continuación para la consulta de registro.
/vendor/laravel/framework/src/illuminate/Database/Connection.php
Y luego podemos usar el lugar DB::getQueryLog()
donde desea imprimir la consulta.
vendor
archivos. Deben mantenerse originales.