[php] Ottieni la query eseguita in Laravel 3/4



9 Answers

È possibile abilitare il " Profiler " in Laravel 3 impostando

'profiler' => true,

Nella tua application/config/application.php e application/config/database.php

Ciò abilita una barra nella parte inferiore di ogni pagina. Una delle sue caratteristiche è elencare le query eseguite e quanto tempo ciascuna ha preso.

Question

Come posso ottenere la query eseguita in Laravel 3/4, usando Fluent Query Builder o Eloquent ORM .

Per esempio:

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

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

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

Oppure ... Come posso salvare nel registro tutte le query eseguite.




Ti consiglio 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 PHP, che estende gli Strumenti per gli sviluppatori con un nuovo pannello che fornisce tutti i tipi di informazioni utili per il debugging e la profilazione degli script PHP, incluse informazioni su richiesta, intestazioni, dati GET e POST, cookie, dati di sessione, query di database, percorsi, visualizzazione del runtime dell'applicazione e altro ancora. Clockwork include il supporto immediato per le applicazioni basate su Laravel 4 e Slim 2, è possibile aggiungere supporto per qualsiasi altro framework personalizzato o tramite un'API estendibile.




Laravel 3

Un altro modo per farlo è:

#config/database.php

'profiler' => true

Per tutti i risultati delle query:

print_r(DB::profiler());

Per ultimo risultato:

print_r(DB::last_query());



Laravel 5

Si noti che questo è l'approccio procedurale , che utilizzo per il debugging 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));
    }

nella tua intestazione, usa:

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

L'output sarà simile a questo (il file di registro predefinito è laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: Query 0: {"query": "seleziona * da" utenti "dove ('user_id' =?)", "Binding": ["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 neofiti di Laravel potrebbero non sapere che c'è una differenza tra le versioni. Dal momento che non vedo mai DD::enableQueryLog() menzionato in una delle risposte che normalmente trovo, potrebbe essere specifico per Laravel 5 - forse qualcuno può commentarlo.




Ultima stampa di query

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



L'utilizzo del log delle query non fornisce l'effettiva query RAW in esecuzione, soprattutto se sono presenti valori associati. Questo è l'approccio migliore per ottenere lo sql raw:

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

o più coinvolti:

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



Per Laraver 4 è

DB::getQueryLog()



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

mettilo in global.php loggerà la tua query sql.




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

\DB::enableQueryLog();



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 .. :)




Related