Obtenga la consulta ejecutada en Laravel 3/4


182

¿Cómo puedo recuperar la consulta SQL sin procesar ejecutada en Laravel 3/4 usando Laravel Query Builder o Eloquent ORM?

Por ejemplo, algo como esto:

DB::table('users')->where_status(1)->get();

O:

(posts (id, user_id, ...))

User::find(1)->posts->get();

De lo contrario, como mínimo, ¿cómo puedo guardar todas las consultas ejecutadas en laravel.log?


¿Qué hay de laravel 5?
Chaudhry Waqas

Respuestas:


318

Laravel 4+

En Laravel 4 y versiones posteriores, debe llamar DB::getQueryLog()para obtener todas las consultas ejecutadas.

$queries = DB::getQueryLog();
$last_query = end($queries);

O puede descargar un paquete de perfiles. Recomiendo barryvdh / laravel-debugbar , que es bastante bueno. Puede leer las instrucciones sobre cómo instalar en su repositorio .

Nota para los usuarios de Laravel 5: deberá llamar DB::enableQueryLog()antes de ejecutar la consulta. Ya sea justo encima de la línea que ejecuta la consulta o dentro de un middleware.


Laravel 3

En Laravel 3, puede obtener la última consulta ejecutada de un Eloquentmodelo que llama al método estático last_queryen la DBclase.

DB::last_query();

Sin embargo, esto requiere que habilite la profileropción en application/config/database.php. Alternativamente, podría, como se mencionó en @dualed, habilitar la profileropción, en application/config/application.phpo llamar DB::profile()para que todas las consultas se ejecuten en la solicitud actual y su tiempo de ejecución.


2
Su código para Laravel 4 no funciona. Me sale esto ErrorException: Advertencia: call_user_func_array()espera que el parámetro 1 sea una devolución de llamada válida, la clase Illuminate\Database\MySqlConnectionno tiene un método getQueryList.
dualidad_

Mi mal, el método correcto es getQueryLog. Lo arregló ahora. ¡Gracias!
rmobis

Extraño ... Obtengo last_query () no está definido en el error del objeto Consulta. Solo estoy llamando a un modelo Eloquent desinstalado.
Aditya MP

1
Para Laravel 3 en realidad es DB :: last_query (); También debe establecer 'perfil' en verdadero en su aplicación / config / database.php
Dan Smart

44
Esto no parece funcionar para un modelo elocuente en L4. Cuando ejecuto Model :: find ($ id) y realizo DB :: getQueryLog (), devuelve una matriz en blanco (). ¿Alguna idea de cómo obtener las consultas para un modelo elocuente?
Abishek

31

Puede habilitar el " Profiler " en Laravel 3 configurando

'profiler' => true,

En tu application/config/application.phpyapplication/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.

ingrese la descripción de la imagen aquí


14
Tenga en cuenta que en Laravel 4, Profiler no está incluido, debe instalarlo usted mismo (p. Ej., Utilizando Composer). Ver esta pregunta SO .
dualidad_

1
Se discute en la primera respuesta allí .
dualidad_

24

Para Eloquent solo puedes hacer:

$result->getQuery()->toSql();

Pero debe eliminar la parte "-> get ()" de su consulta.


17

Recomendaría usar la extensión de Chrome Clockwork con el paquete Laravel https://github.com/itsgoingd/clockwork . Es fácil de instalar y usar.

Clockwork es una extensión de Chrome para el desarrollo de PHP, que amplía las Herramientas para desarrolladores con un nuevo panel que proporciona todo tipo de información útil para depurar y perfilar sus scripts PHP, incluida 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 inmediato para aplicaciones basadas en Laravel 4 y Slim 2, puede agregar soporte para cualquier otro marco personalizado a través de una API extensible.

ingrese la descripción de la imagen aquí


16

Como el generador de perfiles aún no está disponible en Laravel 4 , he creado esta función auxiliar para ver que se genera el SQL:

    función estática pública q ($ all = true) 
    {
        $ consultas = DB :: getQueryLog ();

        if ($ all == false) {
            $ last_query = end ($ consultas);
            return $ last_query;
        }

        devolver $ consultas;
    }

NOTA : establezca el indicador $ all en falso si solo desea la última consulta SQL.

Mantengo este tipo de funciones en una clase llamada DBH.php (abreviatura de Database Helper) para poder llamarlo desde cualquier lugar como este:

dd(DBH::q()); 

Aquí está la salida que obtengo: ingrese la descripción de la imagen aquí

En caso de que se lo pregunte, uso Kint para el formato dd (). http://raveren.github.io/kint/


1
if($all == false)? ¿Por qué no simplemente?if(!$all)
toesslab


14

Aquí hay un fragmento rápido de Javascript que puede lanzar a su 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, lo que facilita la navegación por su sitio y ver qué consultas se ejecutan en cada página.

Cuando haya terminado 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>

Creo que necesitaría "" alrededor de la parte {{json_encode ...}}
mydoglixu

@mydoglixu Dado que DB::getQueryLog()devuelve una matriz, no hay necesidad de rodearla con "". json_encodelo traducirá en consecuencia.
rmobis

@mobis: quise decir que necesita el "" fuera de {{...}} para que JavaScript no arroje un error. así: var queries = "salida json";
mydoglixu

@mydoglixu No, porque una matriz JSON (u objeto) es JavaScript válido. Se rompería si lo hicieras.
rmobis 01 de

@mobis - oh sí, duh
mydoglixu

10

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 su encabezado, use:

     use DB;
     use Illuminate\Support\Facades\Log;

El resultado se verá más o menos 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 especificó Laravel 3/4, pero esta página aparece cuando busco una respuesta general. Los novatos en Laravel pueden no saber que hay una diferencia entre las versiones. Como nunca veo DD::enableQueryLog()mencionado en ninguna de las respuestas que normalmente encuentro, puede ser específico de Laravel 5, tal vez alguien pueda comentar sobre eso.


7

También puede escuchar eventos de consulta con esto:

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});

Consulte la información de los documentos aquí en Escuchar eventos de consulta


6

El uso del registro de consultas no le proporciona la consulta RAW real que se está ejecutando, especialmente si hay valores vinculados. Este es el mejor enfoque para obtener el SQL sin procesar:

DB::table('tablename')->toSql();

o más involucrado:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);

5

Si está utilizando Laravel 5, debe insertar esto antes de la consulta o en el middleware:

\DB::enableQueryLog();


3

en Laravel 4, en realidad puedes usar un Event Listener 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, p start/global.php. Ej . Escribirá las consultas en el registro de información ( storage/log/laravel.log).


3
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

ponlo en global.php registrará tu consulta sql.


2

El generador de perfiles SQL Loic Sharma admite Laravel 4, lo acabo de instalar. Las instrucciones se enumeran aquí . Los pasos son los siguientes:

  1. Agregue "loic-sharma/profiler": "1.1.*"en la sección requerida en composer.json
  2. Realice la actualización automática => php composer.phar self-updateen la consola.
  3. Realice la actualización del compositor => php composer.phar update loic-sharma/profileren la consola también `
  4. Agregue 'Profiler\ProfilerServiceProvider',la matriz de proveedores en app.php
  5. Agregue también 'Profiler' => 'Profiler\Facades\Profiler',la matriz de alias en app.php
  6. Correr php artisan config:publish loic-sharma/profileren la consola

2

Ú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);


0

Laravel 3

Otra forma de hacer esto es:

#config/database.php

'profiler' => true

Para todos los resultados de las consultas:

print_r(DB::profiler());

Para el último resultado:

print_r(DB::last_query());

0

Para obtener la última consulta ejecutada en laravel, utilizaremos la DB::getQueryLog()función de laravel para que devuelva todas las consultas ejecutadas. Para obtener la última consulta, utilizaremos la end()función 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 .


Su respuesta no parece aportar ningún conocimiento nuevo a lo que ya cubre la respuesta aceptada por Raphael_.
Jaak Kütt

0

Hay una manera muy fácil de hacerlo, desde su consulta laravel simplemente cambie el nombre de cualquier columna, le mostrará un error con su consulta .. :)


Rápido camino hacky. No es útil en producción, pero en modo de desarrollo está bien en algunos casos.
cambio,
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.