クマの手も借りたい
馬とテニスとリラックマが好きな IT 系のエンジニアです。
PHP

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

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

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

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
     => 2017-01-01
  )
  [time] => 41.68
)

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

DB::disableQueryLog();

Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/09/21 11:58:20時点 Amazon調べ-詳細)

あなたにオススメ