Laravelで実行されるSQLを確認する2つの方法!

Laravel Laravel

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を挟んでも確認できるので、複数発行している箇所で確認したい時に使うと良いかと思います。

コメント

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