2013-06-27 17 views
10

Laravelには、実行されている実際のSQLが表示されます。 例えば、Railsでは、SQLをコンソールで見ることができます。 Djangoにはツールバーがあります。Laravel 4 SQLログ/コンソール

Laravel 4のようなものがありますか?

明確にする:私の質問は、コードなしでそれを行う方法です。アプリケーションにコードを書く必要がないLaravelには何かが組み込まれていますか?

UPDATE:好ましく私はCLIは、(例えば、php artisan migrateのため)にも照会してもらいたい

答えて

16

あなたはLaravel 4を使用している場合は、この使用:私が思いついた

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

私は非コードソリューションを見つけることを望んでいた:)しかし、感謝! –

+0

OPはこの答えが気に入らなかったが、確かに私は質問をする必要がなくなった。ありがとうございました! – TunaMaxx

1

を本当に簡単な方法(あなたがphp artisan serveとPHP 5.4を使用している場合) - app/start/local.phpにこれを追加します。

DB::listen(function($sql, $bindings, $time) 
{ 
    file_put_contents('php://stderr', "[SQL] {$sql} in {$time} s\n" . 
         "  bindinds: ".json_encode($bindings)."\n"); 
}); 

が、より公式な解決策を探しています。そのために作曲パッケージがあり

[SQL] select 1 in 0.06s 
+0

これは 'artisan tinker'でも同様に有用です。私はこれがRailsのようなコアになることを願っています:) PS:CLIのような 'if(PHP_SAPI == 'cli'){DB :: listen(...'、そうでなければブラウザ要求はSQLログで '/ var/log/apache2/error_log'を埋めることがあります。 –

5

https://packagist.org/packages/loic-sharma/profiler

それは、など、あなたのSQLクエリと下部にツールバーを与えるメッセージを記録します

これは、このようなSQL文を印刷しますご使用の構成でdebugをtrueに設定してください。

+0

私の知る限りでは、コードを書かないでください - 何か組み込みを探していますか? –

+1

これは ''コードを書く ''という意味に依存します。あなたの '' composer.json'の 'required'セクションに' 'loic-sharma/profiler ':" dev-master "作者。 –

+0

これは明らかにOKです。私はこのことを書かなければなりません。Profiler :: startTimer( 'testLogging'); //プロファイラはLaravelのロガーを聞きます。 Log :: info '); Log :: notice('イベントが発生しました。 '); プロファイラー:: endTimer( 'testLogging'); –

8

私はちょうどapp/start/global.phpに一度それを設定するか、どこにでもそれがロードされていることを確認した後、それは、すべてのSQLクエリのログを開始します

Laravel 4でこれを行います。ここで

Event::listen("illuminate.query", function($query, $bindings, $time, $name){ 
    \Log::sql($query."\n"); 
    \Log::sql(json_encode($bindings)."\n"); 
}); 
+1

\ Log :: sql()を使用できるようにLaravel/Monologをどのように設定しましたか?私はLog :: info()を使用する必要があり、デフォルトのログファイルに記録しますが、別のログファイルに記録したいと思います。 – ejunker

+0

実際に何も設定する必要はありません。sqlは "Log"クラスの関数ではないため、呼び出された関数名をLog Type(上記の例ではsql)として使用する__callStaticメソッドで処理されます。 –

6

は迅速Javascriptがあなたのマスターページテンプレート上に投げることができるスニペットです。 含まれている限り、すべてのクエリはブラウザのJavascriptコンソールに出力されます。 これは簡単に読みやすいリストに表示されるので、サイトをブラウズして各ページで実行されているクエリを簡単に確認できます。

デバッグが完了したら、テンプレートから削除するだけです。

<script type="text/javascript"> 
    var queries = {{ json_encode(DB::getQueryLog()) }}; 
    console.log('/****************************** Database Queries ******************************/'); 
    console.log(' '); 
    $.each(queries, function(id, query) { 
     console.log(' ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]); 
    }); 
    console.log(' '); 
    console.log('/****************************** End Queries ***********************************/'); 
</script> 
+1

...生産現場ではこれを削除しないでください! :) – Andrew

0

このコードは直接フォーム他のソースを取ったが、それはに私のために働い従うように私はあなたのためにそれが簡単に作りたいと思っています私の端末ウィンドウを使用してPH30t私は完全なログを見ることができたが、ログインの後にセントリリーものがあった。

1。uは所与のルート設定の下でそれを作ることができるので、その後、任意のルート設定の下で、まったくの上routes.phpにコードの下に追加していない

ex.mysqlウルデータベース名あなたのconfig/database.phpの内側と場所の下

'log'=>true

を追加しますが、そのルートが呼び出されたときにだけ表示されます。

/goto/app/storage/log/somelogfile.log

if (Config::get('database.log', false)) 
{ 
    Event::listen('illuminate.query', function($query, $bindings, $time, $name) 
    { 
     $data = compact('bindings', 'time', 'name'); 

     // Format binding data for sql insertion 
     foreach ($bindings as $i => $binding) 
     { 
      if ($binding instanceof \DateTime) 
      { 
       $bindings[$i] = $binding->format('\'Y-m-d H:i:s\''); 
      } 
      else if (is_string($binding)) 
      { 
       $bindings[$i] = "'$binding'"; 
      } 
     } 

     // Insert bindings into query 
     $query = str_replace(array('%', '?'), array('%%', '%s'), $query); 
     $query = vsprintf($query, $bindings); 

     Log::info($query, $data); 
    }); 
} 

この出力を見ることがいけないのブレークポイントを作ることを忘れて....または私にpingを実行:)

0

QueryBuilderインスタンスでメソッドtoSql()があります。

echo DB::table('employees')->toSql()

返します:

select * from `employees` 

これは、クエリを示しする最も簡単な方法です。

関連する問題