Laravel で Eloquent を使ってクエリを発行する際、実際に実行される SQL 文を確認したい時があります。
どちらかというと、O/R マッパーみたいなものは好きではなくて、生の SQL 文を書いて実行する方がいいのですが、Eloquent を使うメリットももちろんあるので、ここでは触れません。
Eloquentの使い方
実際に、生成したクエリオブジェクト(仮に $query とします)で、データ件数を取得する際は下記のように count() メソッドを実行します。
1 | $query->count(); |
データの一覧を取得したい場合は get()、最初の 1 件のみを取得したい場合は first() のメソッドを呼び出します。結果は stdClass オブジェクトになるので、連想配列が欲しい場合は toArray() で変換してください。
1 2 3 | $query->get(); $query->first(); $query->get()->toArray(); |
SQL文を出力して確認
本題に戻りますが、SQL 文を出力する場合は toSql() メソッドを使います。これで、条件などがバインドされる前の SQL が取得できます。
1 | $query->toSql(); |
例えば下記のような SQL が出力されます。
1 | select id from hoges where name = ? and birthday = ? |
バインド変数や実行時間を確認
バインドされた値も知りたい場合は、$query オブジェクトのメソッドでは実現できないので、DB オブジェクトを利用します。クエリ発行の前に、DB::enableQueryLog() を実行しておいて、クエリ発行後に DB::getQueryLog() することで詳細が確認できます。
1 2 3 | DB::enableQueryLog(); $query->get(); DB::getQueryLog(); |
この DB::getQueryLog() の内容をログに出力しておけば以下の情報が確認できます。実行時間も確認できるので便利ですね。
1 2 3 4 5 6 7 8 | [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();