Ottieni la query eseguita in Laravel 3/4


182

Come posso recuperare la query SQL eseguita non elaborata in Laravel 3/4 utilizzando Laravel Query Builder o Eloquent ORM?

Ad esempio, qualcosa del genere:

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

O:

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

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

Altrimenti, almeno come posso salvare tutte le query eseguite su laravel.log?


che dire di laravel 5?
Chaudhry Waqas,

Risposte:


318

Laravel 4+

In Laravel 4 e versioni successive, devi chiamare DB::getQueryLog()per ottenere tutte le query eseguite.

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

Oppure puoi scaricare un pacchetto di profiler. Consiglierei barryvdh / laravel-debugbar , che è abbastanza pulito. Puoi leggere le istruzioni su come installare nel loro repository .

Nota per gli utenti di Laravel 5: è necessario chiamare DB::enableQueryLog()prima di eseguire la query. O appena sopra la riga che esegue la query o all'interno di un middleware.


Laravel 3

In Laravel 3, è possibile ottenere l'ultima query eseguita da un Eloquentmodello che chiama il metodo statico last_querysulla DBclasse.

DB::last_query();

Ciò, tuttavia, richiede di abilitare l' profileropzione in application/config/database.php. In alternativa, come indicato da @dualed, è possibile abilitare l' profileropzione, in application/config/application.phpo call DB::profile()per eseguire tutte le query nella richiesta corrente e il relativo tempo di esecuzione.


2
Il tuo codice per Laravel 4 non funziona. Ottengo questo ErrorException: Avviso: si call_user_func_array()aspetta che il parametro 1 sia un callback valido, la classe Illuminate\Database\MySqlConnectionnon ha un metodo getQueryList.
dualità_

Mio cattivo, il metodo corretto è getQueryLog. Risolto il problema ora. Grazie!
rmobis,

Strano ... Ottengo last_query () non definito sull'errore dell'oggetto Query. Sto solo invocando un modello eloquente non comprovato.
MP Aditya,

1
Per Laravel 3 è in realtà DB :: last_query (); Devi anche impostare 'profilo' su true nella tua applicazione / config / database.php
Dan Smart

4
Questo non sembra funzionare per un modello eloquente su L4. Quando eseguo Model :: find ($ id) ed eseguo DB :: getQueryLog () restituisce un array vuoto (). Qualche idea su come ottenere le query per un modello eloquente?
Abishek,

31

È possibile abilitare il " Profiler " in Laravel 3 impostando

'profiler' => true,

Nel tuo application/config/application.phpeapplication/config/database.php

Questo abilita una barra nella parte inferiore di ogni pagina. Una delle sue caratteristiche è elencare le query eseguite e il tempo impiegato da ciascuna.

inserisci qui la descrizione dell'immagine


14
Si noti che in Laravel 4, il Profiler non è incluso, è necessario installarlo da soli (ad esempio utilizzando il compositore). Vedi questa domanda SO .
dualità_

1
È discusso nella prima risposta lì .
dualità_

24

Per Eloquent puoi semplicemente fare:

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

Ma è necessario rimuovere la parte "-> get ()" dalla query.


17

Consiglierei di utilizzare l'estensione Chrome Clockwork con il pacchetto Laravel https://github.com/itsgoingd/clockwork . È facile da installare e utilizzare.

Clockwork è un'estensione di Chrome per lo sviluppo di PHP, che estende gli Strumenti per gli sviluppatori con un nuovo pannello che fornisce tutti i tipi di informazioni utili per il debug e la profilazione degli script PHP, tra cui informazioni su richiesta, intestazioni, dati GET e POST, cookie, dati di sessione, query di database, percorsi, visualizzazione del runtime dell'applicazione e altro. Clockwork include il supporto immediato per le applicazioni basate su Laravel 4 e Slim 2, è possibile aggiungere il supporto per qualsiasi altro framework personalizzato tramite un'API estensibile.

inserisci qui la descrizione dell'immagine


16

Poiché il profiler non è ancora uscito in Laravel 4 , ho creato questa funzione di supporto per vedere l'SQL generato:

    funzione statica pubblica q ($ all = true) 
    {
        $ queries = DB :: getQueryLog ();

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

        restituisce $ query;
    }

NOTA : impostare il flag $ all su false se si desidera solo l'ultima query SQL.

Tengo questo tipo di funzioni in una classe chiamata DBH.php (abbreviazione di Database Helper) in modo da poterlo chiamare da qualsiasi luogo come questo:

dd(DBH::q()); 

Ecco l'output che ottengo: inserisci qui la descrizione dell'immagine

Nel caso ti stia chiedendo, io uso Kint per la formattazione dd (). http://raveren.github.io/kint/


1
if($all == false)? Perché non semplicementeif(!$all)
toesslab il


14

Ecco un breve frammento Javascript che puoi inserire nel tuo modello di pagina principale. Finché è incluso, tutte le query verranno inviate alla console Javascript del tuo browser. Li stampa in un elenco facilmente leggibile, semplificando la navigazione all'interno del sito e vedere quali query sono in esecuzione su ogni pagina.

Al termine del debug, rimuovilo dal modello.

<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>

Penso che avresti bisogno di "" intorno alla parte {{json_encode ...}}
mydoglixu,

@mydoglixu Poiché DB::getQueryLog()restituisce un array, non è necessario circondarlo con "". json_encodelo tradurrà di conseguenza.
rmobis,

@mobis - Volevo dire che hai bisogno del "" fuori da {{...}} in modo che javascript non generi un errore. in questo modo: var queries = "json output";
mydoglixu,

@mydoglixu No, perché un array (o un oggetto) JSON è JavaScript valido. Si spezzerebbe se lo facessi.
rmobis,

@mobis - oh yeah, duh
mydoglixu

10

Laravel 5

Si noti che questo è l' approccio procedurale , che utilizzo per il debug rapido

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

nell'intestazione, utilizzare:

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

L'output avrà un aspetto simile al seguente (il file di registro predefinito è laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: query 0: {"query": "seleziona * da 'utenti' dove ('user_id' =?)", "Bindings": ["9"] , "tempo": 0,23}

*** So che questa domanda ha specificato Laravel 3/4 ma questa pagina viene visualizzata quando si cerca una risposta generale. I principianti di Laravel potrebbero non sapere che c'è una differenza tra le versioni. Dal momento che non vedo mai DD::enableQueryLog()menzionato in nessuna delle risposte che trovo normalmente, potrebbe essere specifico per Laravel 5 - forse qualcuno può commentarlo.


7

Puoi anche ascoltare gli eventi di query usando questo:

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

Consulta le informazioni dai documenti qui in Listening For Query Events


6

L'uso del registro delle query non fornisce la query RAW effettiva in esecuzione, soprattutto se sono presenti valori associati. Questo è l'approccio migliore per ottenere il sql grezzo:

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

o più coinvolti:

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

5

Se si utilizza Laravel 5, è necessario inserirlo prima della query o sul middleware:

\DB::enableQueryLog();


3

in Laravel 4 puoi effettivamente utilizzare un Listener di eventi per le query del database.

Event::listen('illuminate.query', function($sql, $bindings)
{
    foreach ($bindings as $val) {
        $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
    }

    Log::info($sql);
});

Posiziona questo frammento ovunque, ad esempio in start/global.php. Scriverà le query nel registro informazioni ( storage/log/laravel.log).


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

inseriscilo in global.php registrerà la tua query sql.


2

Il profiler SQL Loic Sharma supporta Laravel 4, l'ho appena installato. Le istruzioni sono elencate qui . I passaggi sono i seguenti:

  1. Aggiungi "loic-sharma/profiler": "1.1.*"nella sezione richiesta in composer.json
  2. Esegui auto-aggiornamento => php composer.phar self-updatenella console.
  3. Esegui anche l'aggiornamento del compositore => php composer.phar update loic-sharma/profilernella console `
  4. Inserisci 'Profiler\ProfilerServiceProvider', l'array del provider in app.php
  5. Aggiungi anche 'Profiler' => 'Profiler\Facades\Profiler',l'array aliasses in app.php
  6. Esegui php artisan config:publish loic-sharma/profilernella console

2

Ultima query di stampa

$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

Un altro modo per farlo è:

#config/database.php

'profiler' => true

Per tutte le query risultato:

print_r(DB::profiler());

Per l'ultimo risultato:

print_r(DB::last_query());

0

Per ottenere l'ultima query eseguita in laravel, useremo la DB::getQueryLog()funzione di laravel che restituirà tutte le query eseguite. Per ottenere l'ultima query utilizzeremo la end()funzione che restituisce l'ultima query eseguita.

$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);

Ho preso riferimento da http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php .


La tua risposta non sembra fornire alcuna nuova conoscenza a ciò che già copre la risposta accettata da Raffaello.
Jaak Kütt,

0

C'è un modo molto semplice per farlo, dalla tua query laravel basta rinominare qualsiasi nome di colonna, ti mostrerà un errore con la tua query .. :)


Modo veloce hacky. Non utile in produzione, ma in modalità di sviluppo va bene in alcuni casi.
invece
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.