開発していてDBからの結果が思ったものと違った場合や、パフォーマンスを見たい場合、発行されるクエリを確認したいことがあります。本記事ではSQLの確認方法を2つ紹介します。
1. お手軽版:toSql()を使う
Query Builderを利用した時に想定したSQLと合っているか確認する時などに利用します。
$sql = DB::table('users')
->where('status', 1)
->toSql();
または
$sql = User::where('status', 1)->toSql();
上記を実行すると以下のような結果が返ってきます。
select * from `users` where `status` = ?
プレースホルダの値も見たい場合は以下のようにgetBindings()
を利用します。
$query = User::where('status', 1);
$sql = $query->toSql();
$bindings = $query->getBindings();
Illuminate\Database\Query\Builder | Laravel API
2. SQLを複数見たい:getQueryLog()を使う
N+1問題や、複数のクエリを見たい場合などに利用します。
enableQueryLog()
のある箇所からgetQueryLog()
の場所までのクエリを全部見ることができます。
DB::enableQueryLog();
// 見たいSQLを実行
$users = User::where('status', 1)->get();
$posts = Post::where('user_id', 1)->get();
// SQLを配列で取得します
$sqls = DB::getQueryLog();
上記を実行(今回はtinkerで実行)すると以下のような結果が返ってきます。実行時間もあるので助かりますね。
[
[
"query" => "select * from `users` where `status` = ?",
"bindings" => [
1,
],
"time" => 108.87,
],
[
"query" => "select * from `posts` where `user_id` = ?",
"bindings" => [
1,
],
"time" => 26.29,
],
]
コメント