php - route - Obtener la consulta ejecutada en Laravel 3/4
slug laravel (20)
¿Cómo puedo obtener la consulta ejecutada en Laravel 3/4, usando Fluent Query Builder o Eloquent ORM ?
Por ejemplo:
DB::table(''users'')->where_status(1)->get();
O (posts (id, user_id, ...))
User::find(1)->posts->get();
O ... Cómo puedo guardar en el registro, todas las consultas ejecutadas.
L4 one-liner
(Que escribir consulta):
$q=/DB::getQueryLog();dd(end($q));
Laravel 3
Otra forma de hacer esto es:
#config/database.php
''profiler'' => true
Para todas las consultas resultado:
print_r(DB::profiler());
Para el último resultado:
print_r(DB::last_query());
Laravel 4
En Laravel 4, debe llamar a DB::getQueryLog()
para obtener todas las consultas de DB::getQueryLog()
.
$queries = DB::getQueryLog();
$last_query = end($queries);
O puede descargar un paquete de perfilador. Recomiendo barryvdh/laravel-debugbar , que es bastante limpio. Puede leer para obtener instrucciones sobre cómo instalar en su repository .
Laravel 3
En Laravel 3, puede obtener la última consulta ejecutada desde un modelo Eloquent
llamando al método estático last_query
en la clase DB
.
DB::last_query();
Esto, sin embargo, requiere que habilite la opción profiler
en application/config/database.php
. Alternativamente, podría, como se menciona en @dualed, habilitar la opción del profiler
en application/config/application.php
o llamar a DB::profile()
para obtener todas las consultas ejecutadas en la solicitud actual y su tiempo de ejecución.
Laravel 5
Tenga en cuenta que este es el enfoque de procedimiento , que utilizo para la depuración rápida
DB::enableQueryLog();
// Run your queries
// ...
// Then to retrieve everything since you enabled the logging:
$queries = DB::getQueryLog();
foreach($queries as $i=>$query)
{
Log::debug("Query $i: " . json_encode($query));
}
en tu encabezado, usa:
use DB;
use Illuminate/Support/Facades/Log;
La salida se verá algo así (el archivo de registro predeterminado es laravel.log ):
[2015-09-25 12:33:29] testing.DEBUG: Consulta 0: {"query": "select * from ''users'' where (''user_id'' =?)", "Bindings": ["9"] , "tiempo": 0.23}
*** Sé que esta pregunta especificaba Laravel 3/4, pero esta página aparece cuando se busca una respuesta general. Los principiantes de Laravel pueden no saber que hay una diferencia entre versiones. Como nunca veo DD::enableQueryLog()
mencionado en ninguna de las respuestas que normalmente encuentro, puede ser específico de Laravel 5; quizás alguien pueda comentar sobre eso.
Aquí hay un fragmento de JavaScript rápido que puedes incluir en tu plantilla de página maestra. Siempre que esté incluido, todas las consultas se enviarán a la Consola JavaScript de su navegador. Los imprime en una lista fácil de leer, por lo que es sencillo navegar por su sitio y ver qué consultas se están ejecutando en cada página.
Cuando termine de depurar, simplemente elimínelo de su plantilla.
<script type="text/javascript">
var queries = {{ json_encode(DB::getQueryLog()) }};
console.log(''/****************************** Database Queries ******************************/'');
console.log('' '');
queries.forEach(function(query) {
console.log('' '' + query.time + '' | '' + query.query + '' | '' + query.bindings[0]);
});
console.log('' '');
console.log(''/****************************** End Queries ***********************************/'');
</script>
Como el generador de perfiles aún no está disponible en Laravel 4 , creé esta función auxiliar para ver el SQL que se está generando:
public static function q($all = true) { $queries = DB::getQueryLog(); if($all == false) { $last_query = end($queries); return $last_query; } return $queries; }
NOTA : Establezca el indicador $ all en falso si solo desea la última consulta SQL.
Guardo este tipo de funciones en una clase llamada DBH.php (abreviatura de Database Helper) para que pueda llamarla desde cualquier lugar como este:
dd(DBH::q());
Aquí está la salida que obtengo:
En caso de que se lo pregunte, utilizo Kint para el formateo dd (). http://raveren.github.io/kint/
El generador de perfiles Loic Sharma SQL es compatible con Laravel 4, simplemente lo instalé. Las instrucciones se enumeran aquí . Los pasos son los siguientes:
- Agregue
"loic-sharma/profiler": "1.1.*"
En la sección require en composer.json - Realice la auto actualización =>
php composer.phar self-update
en la consola. - Realice la actualización del compositor =>
php composer.phar update loic-sharma/profiler
en la consola también ` - Agregue
''Profiler/ProfilerServiceProvider'',
en la matriz de proveedores en app.php - Agregue
''Profiler'' => ''Profiler/Facades/Profiler'',
en la matriz de aliasses en app.php también - Ejecute la
php artisan config:publish loic-sharma/profiler
en la consola
El uso del registro de consultas no le proporciona la consulta RAW real que se está ejecutando, especialmente si hay valores encuadernados. Este es el mejor enfoque para obtener el sql en bruto:
DB::table(''tablename'')->toSql();
o más involucrado:
$query = Article::whereIn(''author_id'', [1,2,3])->orderBy(''published'', ''desc'')->toSql();
dd($query);
Hay una forma muy sencilla de hacerlo, desde su consulta de Laravel solo cambie el nombre de cualquier columna, le mostrará un error con su consulta ... :)
O como alternativa a laravel 3 profiler puedes usar:
Para Eloquent puedes hacer lo siguiente:
$result->getQuery()->toSql();
Pero debe eliminar la parte "-> get ()" de su consulta.
Para Laraver 4 es
DB::getQueryLog()
Para obtener la última consulta ejecutada en laravel, utilizaremos la función DB::getQueryLog()
de laravel para devolver todas las consultas ejecutadas. Para obtener la última consulta utilizaremos la función end()
que devuelve la última consulta ejecutada.
$student = DB::table(''student'')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);
He tomado referencia de http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php .
Puede habilitar el " Analizador " en Laravel 3 configurando
''profiler'' => true,
En su application/config/application.php
y application/config/database.php
Esto habilita una barra en la parte inferior de cada página. Una de sus características es enumerar las consultas ejecutadas y cuánto tiempo tomó cada una.
Si está utilizando Laravel 5, debe insertarlo antes de la consulta o en middleware:
/DB::enableQueryLog();
También puede escuchar eventos de consulta usando esto:
DB::listen(function($sql, $bindings, $time)
{
var_dump($sql);
});
Consulte la información de los documentos here debajo de Listening For Query Events
Yo recomendaría usar la extensión de Chrome Clockwork con el paquete de Laravel https://github.com/itsgoingd/clockwork . Es fácil de instalar y usar.
Clockwork es una extensión de Chrome para desarrollo de PHP, extendiendo Developer Tools con un nuevo panel que proporciona todo tipo de información útil para depurar y perfilar sus scripts PHP, incluyendo información sobre solicitud, encabezados, datos GET y POST, cookies, datos de sesión, consultas de bases de datos, rutas, visualización del tiempo de ejecución de la aplicación y más. Clockwork incluye soporte para aplicaciones basadas en Laravel 4 y Slim 2, puede agregar soporte para cualquier otro framework personalizado a través de una API extensible.
en Laravel 4 puedes usar un detector de eventos para consultas de bases de datos.
Event::listen(''illuminate.query'', function($sql, $bindings)
{
foreach ($bindings as $val) {
$sql = preg_replace(''//?/'', "''{$val}''", $sql, 1);
}
Log::info($sql);
});
Coloque este fragmento en cualquier lugar, por ejemplo, en start/global.php
. Escribirá las consultas al registro de información ( storage/log/laravel.log
).
Última consulta imprimir
$queries = /DB::getQueryLog();
$last_query = end($queries);
// Add binding to query
foreach ($last_query[''bindings''] as $val) {
$last_query[''query''] = preg_replace(''//?/'', "''{$val}''", $last_query[''query''], 1);
}
dd($last_query);
Event::listen(''illuminate.query'', function($sql, $param)
{
/Log::info($sql . ", with[" . join('','', $param) ."]<br>/n");
});
ponerlo en global.php registrará su consulta sql.