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

Laravel Laravel

開発していて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,
  ],
]

コメント

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