PHP

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

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

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

Eloquentの使い方

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

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

SQL文を出力して確認

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

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

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

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

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

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

DB::disableQueryLog();