LaravelでEloquentを使用したときに、発行されるSQLを確認する方法について書いています。
掲載しているコードはLaravelのバージョン9.0で検証しました。
toSqlとgetBindingsでSQLを確認する
最初にtoSqlメソッドと、getBindingsメソッドを使用してみます。
$userBuilder = User::whereIn('id', [3, 6, 8]);
dd($userBuilder->toSql(), $userBuilder->getBindings());
モデルから条件を付けて、firstやgetを呼ばずに変数で受けるとIlluminate\Database\Eloquent\Builder
クラスのオブジェクトが返ってきます。
BuilderオブジェクトからtoSqlメソッドを呼ぶと、実際に実行するSQLがパラメータ箇所を「?
」で伏せた状態で返ってきます。
select * from "users" where "id" in (?, ?, ?)
getBindingsメソッドを呼ぶと、SQLに当て込むパラメータを確認できます。
[
0 => 3
1 => 6
2 => 8
]
パラメータを当てはめた状態にする
Laravelで用意されているpreg_replace_arrayヘルパーを使用すると、簡単に置換することができます。
dd(preg_replace_array('/\?/', $userBuilder->getBindings(), $userBuilder->toSql()));
preg_replace_arrayヘルパーの第1引数には、文字列の置換したい箇所を正規表現で書きます。
第2引数には、置換する対象文字配列を指定します。
第3引数には、置換する元の文字列のを指定します。
今回はSQLの?
の箇所を探して、パラメータの配列の値で順に置換している形になります。
enableQueryLogとgetQueryLogでSQLを確認する
次にenableQueryLogメソッドとgetQueryLogメソッドを使用してみます。
公式ドキュメントのこの辺りに記載がありました。(バージョンが古いですが…)
enableQueryLogメソッドを呼び出すと、呼び出した以降に実行されたクエリのログをメモリーに保持しておいてくれます。
実行されたクエリの内容を取得する場合にgetQueryLogメソッドを使用します。
\DB::enableQueryLog();
$users = User::whereIn('id', [3, 6, 8])->get();
$user = User::find(1);
dd(\DB::getQueryLog());
ddヘルパーで出力される内容は、下記のようになります。
^ array:2 [▼
0 => array:3 [▼
"query" => "select * from "users" where "id" in (?, ?, ?)"
"bindings" => array:3 [▼
0 => 3
1 => 6
2 => 8
]
"time" => 4.06
]
1 => array:3 [▼
"query" => "select * from "users" where "users"."id" = ? limit 1"
"bindings" => array:1 [▼
0 => 1
]
"time" => 0.09
]
]
getQueryLogを実行すると、それぞれ実行したSQLの内容が、配列として返ってきています。
それぞれの配列キーのqueryの値でSQLが確認できました。
複数のSQLを挟んでも確認できるので、複数発行している箇所で確認したい時に使うと良いかと思います。
コメント