[Laravel]実行するSQLを確認する方法

Laravel Laravel

はじめに

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文を表示し、出力後スクリプトを止める

情報に応じて、最適な方法を選んで使用しましょう。

コメント

タイトルとURLをコピーしました