Laravel Query BuilderまたはEloquent ORMを使用してLaravel 3/4で未処理の実行SQLクエリを取得する方法を教えてください。
たとえば、次のようになります。
DB::table('users')->where_status(1)->get();
または
(posts (id, user_id, ...))
User::find(1)->posts->get();
そうでなければ、少なくとも私はどうすればlaravel.logに実行されたすべてのクエリを保存することができますか?
Laravel 4以降では、すべての実行済みクエリを取得するにはDB::getQueryLog()
を呼び出す必要があります。
$queries = DB::getQueryLog();
$last_query = end($queries);
あるいはプロファイラーパッケージをダウンロードすることもできます。私は barryvdh/laravel-debugbar をお勧めします。これはかなりきれいです。インストール方法については リポジトリ を参照してください。
Laravel 5ユーザーへのメモ:クエリを実行する前にDB::enableQueryLog()
を呼び出す必要があります。クエリを実行する行のすぐ上、またはミドルウェアの内側のいずれかです。
Laravel 3では、Eloquent
クラスの静的メソッドlast_query
を呼び出すDB
モデルから最後に実行されたクエリを取得できます。
DB::last_query();
ただし、これにはapplication/config/database.php
のprofiler
オプションを有効にする必要があります。あるいは@dualedで述べたように、application/config/application.php
でprofiler
オプションを有効にするか、DB::profile()
を呼び出して現在のリクエストで実行されたクエリとその実行時間を取得することもできます。
設定することでLaravel 3で "Profiler"を有効にすることができます。
'profiler' => true,
あなたのapplication/config/application.php
とapplication/config/database.php
に
これにより、各ページの下部にバーが表示されます。その機能の1つは、実行されたクエリとそれぞれのクエリに要した時間を一覧表示することです。
Eloquentの場合は、次のようにします。
$result->getQuery()->toSql();
しかし、あなたはあなたのクエリから " - > get()"部分を削除する必要があります。
Chrome拡張機能 Clockwork Laravelパッケージ https://github.com/itsgoingd/clockwork を使用することをお勧めします。インストールと使用は簡単です。
ClockworkはPHP開発用のChrome拡張機能で、開発者ツールを新しいパネルで拡張して、リクエスト、ヘッダー、GETに関する情報を含むPHPスクリプトのデバッグとプロファイリングに役立つあらゆる情報を提供しますPOSTデータ、Cookie、セッションデータ、データベースクエリ、ルート、アプリケーションランタイムの視覚化など。 ClockworkはLaravel 4とSlim 2ベースのアプリケーションのための独創的なサポートを含みます、あなたは拡張可能なAPIを介して他のまたはカスタムフレームワークのためのサポートを追加することができます。
プロファイラはまだLaravel 4には含まれていないので、生成されているSQLを確認するためにこのヘルパー関数を作成しました。
パブリック静的関数q($ all = true) { $ query = DB :: getQueryLog(); ] if($ all == false){ $ last_query = end($ query); return $ last_query; } return $クエリ; }
NOTE:$ allフラグをfalseに設定します最後のSQLクエリだけが必要な場合。
私はこの種の関数をDBH.php(Database Helperの略)と呼ばれるクラスに保持しているので、このようにどこからでも呼び出すことができます。
dd(DBH::q());
これが私が得る出力です:
ご参考までに、dd()のフォーマットにはKintを使用します。 http://raveren.github.io/kint/
Laravel 4では
DB::getQueryLog()
これがあなたのマスターページテンプレートに投げることができる簡単なJavascriptスニペットです。含まれている限り、すべてのクエリはブラウザのJavascriptコンソールに出力されます。読みやすいリストにそれらを印刷するので、あなたのサイトを閲覧したり、各ページでどんなクエリが実行されているかを見るのが簡単になります。
デバッグが終わったら、テンプレートから削除してください。
<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>
これはproceduralアプローチであることに注意してください。私はこれをクイックデバッグに使用します。
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));
}
ヘッダには、
use DB;
use Illuminate\Support\Facades\Log;
出力は次のようになります(デフォルトのログファイルはlaravel.log)。
[2015-09-25 12:33:29] testing.DEBUG:クエリ0:{"クエリ": "( 'user_id' =?)"から "*を選択"、 "バインディング":["9"] 、 "時間":0.23}
***私はこの質問がLaravel 3/4を指定しているのを知っていますが、このページは一般的な答えを探すときに現れます。 Laravelの初心者は、バージョン間に違いがあることを知らないかもしれません。 DD::enableQueryLog()
が普段見ている答えのどれにも言及されていないので、それはmay Laravel 5に固有のものである - おそらく誰かがそれについてコメントすることができます。
これを使ってクエリイベントを監視することもできます。
DB::listen(function($sql, $bindings, $time)
{
var_dump($sql);
});
ドキュメントの情報を参照してください。 こちらクエリイベントを聞く
クエリログを使用しても、特にバインドされた値がある場合は、実際に実行されているRAWクエリは表示されません。これは生のSQLを取得するための最良の方法です。
DB::table('tablename')->toSql();
もっと関係している:
$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);
Laravel 5を使用している場合は、クエリの前またはミドルウェアでこれを挿入する必要があります。
\DB::enableQueryLog();
あるいは、laravel 3プロファイラーの代わりに次のものを使用できます。
https://github.com/paulboco/profiler または https://github.com/barryvdh/laravel-debugbar
Laravel 4では、データベースクエリにEvent Listenerを実際に使用できます。
Event::listen('illuminate.query', function($sql, $bindings)
{
foreach ($bindings as $val) {
$sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
}
Log::info($sql);
});
このスニペットはどこにでも配置できます。 start/global.php
にあります。クエリを情報ログ(storage/log/laravel.log
)に書き込みます。
Event::listen('illuminate.query', function($sql, $param)
{
\Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});
global.phpに入れると、SQLクエリがログに記録されます。
Loic Sharma SQLプロファイラはLaravel 4をサポートしています。インストールしたばかりです。指示 ここにリストされている 。手順は次のとおりです。
"loic-sharma/profiler": "1.1.*"
を追加します。php composer.phar self-update
を実行してください。php composer.phar update loic-sharma/profiler
を実行する'Profiler\ProfilerServiceProvider',
を追加します'Profiler' => 'Profiler\Facades\Profiler',
を追加するphp artisan config:publish loic-sharma/profiler
を実行します最後のクエリの印刷
$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);
(クエリを書く):
$q=\DB::getQueryLog();dd(end($q));
それを行うのは非常に簡単な方法があります、あなたのlaravelクエリからちょうど任意のカラム名を変更してください、それはあなたのクエリでエラーを表示します.. :)
これを行う別の方法は、次のとおりです。
#config/database.php
'profiler' => true
すべてのクエリについて結果:
print_r(DB::profiler());
最後の結果の場合:
print_r(DB::last_query());
最後に実行されたクエリをlaravelで取得するには、laravelのDB::getQueryLog()
関数を使用して、実行されたすべてのクエリを返します。最後のクエリを取得するには、最後に実行されたクエリを返すend()
関数を使います。
$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);
私は http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php から参照を取りました。