LaravelのEloquentで実行されるSQL文を出力する

LaravelのEloquentで実行されるSQL文を出力する

記事一覧LaravelのEloquentで実行されるSQL文を出力する

Laravel で Eloquent を使ってクエリを発行する際、実際に実行される SQL 文を確認したい時があります。

どちらかというと、O/R マッパーみたいなものは好きではなくて、生の SQL 文を書いて実行する方がいいのですが、Eloquent を使うメリットももちろんあるので、ここでは触れません。

実際に、生成したクエリオブジェクト(仮に $query とします)で、データ件数を取得する際は下記のように count() メソッドを実行します。

$query->count();

データの一覧を取得したい場合は get()、最初の 1 件のみを取得したい場合は first() のメソッドを呼び出します。結果は stdClass オブジェクトになるので、連想配列が欲しい場合は toArray() で変換してください。

$query->get();

$query->first();

$query->get()->toArray();

目次

SQL文を出力して確認

本題に戻りますが、SQL 文を出力する場合は toSql() メソッドを使います。これで、条件などがバインドされる前の SQL が取得できます。

$query->toSql();

例えば下記のような SQL が出力されます。

select id from hoges where name = ? and birthday = ?

バインド変数や実行時間を確認

バインドされた値も知りたい場合は、$query オブジェクトのメソッドでは実現できないので、DB オブジェクトを利用します。クエリ発行の前に、DB::enableQueryLog() を実行しておいて、クエリ発行後に DB::getQueryLog() することで詳細が確認できます。

DB::enableQueryLog();

$query->get();

DB::getQueryLog();

この DB::getQueryLog() の内容をログに出力しておけば以下の情報が確認できます。実行時間も確認できるので便利ですね。

[query] => select id from hoges where name = ? and birthday = ?
[bindings] => Array
  (
    [0] => saratoga
    [1] => 2017-01-01
  )
  [time] => 41.68
)

ただし、ログ出力を有効にすると、それ以降はすべて対象となるので、発行する SQL が多い場合はログが不要なところで DB::disableQueryLog() しておくと良さそうです。

DB::disableQueryLog();

参考カテゴリ

エンジニア記事一覧

最新の投稿やよく見られているのオススメ記事一覧です。