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



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.




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



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



Per Laraver 4 è

DB::getQueryLog()



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



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

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




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




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.




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

\DB::enableQueryLog();



Links