はじめに
LaravelでEloquent ORMやQuery Builderを使ってSQLを実行する際に、実際にどのようなSQLが実行されているのかを確認したいことがあります。これは、デバッグはもちろん、性能調整にも有用です。
この記事では、Laravelで実行するSQLを確認する不合な手法をご紹介します。
1. toSql() メソッドを使用する
toSql()
メソッドを使うと、EloquentやQuery Builderが生成するSQL文を確認できます。ただし、バインディング値は表示されません。
$query = User::where('id', 1);
// SQLを表示
$sql = $query->toSql();
echo $sql;
// 出力
// SELECT * FROM `users` WHERE `id` = ?
2. DB::listen() メソッドを使用する
DB::listen()
を使用すると、実際に実行されたSQL、バインディング値、実行時間を取得できます。
\DB::listen(function ($query) {
\Log::info($query->sql);
\Log::info($query->bindings);
\Log::info($query->time);
});
実際にログを確認するには
storage/logs/laravel.log`を見ましょう。
3. DB::enableQueryLog() を使用する
複数のSQL実行ログ
を一括で取得する場合に、DB::enableQueryLog()
を使用することができます。
\DB::enableQueryLog();
// 何らかのクエリ実行
$users = User::where('email', 'example@example.com')->get();
// 実行されたSQLを取得
$queries = \DB::getQueryLog();
dd($queries);
4. $query->dd() / $query->dump() を使用する
EloquentクエリのSQL文を表示する最短の手段として、dd()
やdump()
を使用できます。
$query = User::where('id', 1);
$query->dd(); // SQL文を出力して出力後スクリプトが止まる
$query->dump(); // SQL文を出力するが出力後に止まらない
まとめ
LaravelでSQL実行内容を確認する手段には、多様な方法があります。
手段 | 特徴 |
---|---|
toSql() | SQL文を表示。バインディング値は表示されない |
DB::listen() | 実際のSQLと実行時間をログ出力 |
DB::enableQueryLog() | 複数SQLを一括取得 |
$query->dd() | SQL文を表示し、出力後スクリプトを止める |
情報に応じて、最適な方法を選んで使用しましょう。
コメント