SQLのデバッグのために、SQLとバインドされた値を確認したいことがあります。
その時に使える方法として、よく提示されるのは以下の2つです。
1.enableQueryLogメソッドとgetQueryLogメソッドを使う
クラス:Illuminate\Database\Connection
出力タイミング:クエリ実行後
2.toSqlメソッドとgetBindingsメソッドを使う
クラス:Illuminate\Database\Query\Bulder
出力タイミング:クエリ実行前
実行したSQLを見たいのであれば、
enableQueryLogメソッドとgetQueryLogメソッドの方が使いやすいと思います
toSqlメソッドとgetBindingsメソッドの場合、クエリ実行前でないといけません。
また、Modelのメソッドが以下のように書いてあると、ちょっとした書き直しが必要になったりと少々面倒なのです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Answer extends Model { // 詳細ページに表示する内容を返す public function details($id) { return $this->join('users', 'answers.user_id', '=', 'users.id') ->select( 'users.name', 'answers.id', 'answers.question_id', 'answers.body', 'answers.created_at', ) ->where('question_id', '=', $id,) ->orwhere('user_id', '=', 2) ->get() ; } } |
enableQueryLogメソッドとgetQueryLogメソッドの場合
実行前後に挟むだけでOKなので、デバッグし易いといえます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Controller側 public function show($id) { $answer = new Answer; \DB::enableQueryLog(); // ①ロギングを有効化する $answer->details($id); // ②クエリを実行する dd(\DB::getQueryLog()); // ③ログを出力する return view('question.detail', ['answers' => $answer->details($id)]); } |
出力画面
ちなみに、処理時間がミリ秒で表示されます。
toSqlメソッドとgetBindingsメソッドの場合
今回掲載したModelのメソッドの場合、
returnをさせずに、実行前にクエリを出力するよう修正するのでちょっと手間です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class Answer extends Model { // 詳細ページに表示する内容を返す public function details($id) { // ①クエリの生成 // return $this->join('users', 'answers.user_id', '=', 'users.id') $query = $this->join('users', 'answers.user_id', '=', 'users.id') ->select( 'users.name', 'answers.id', 'answers.question_id', 'answers.body', 'answers.created_at', ) ->where('question_id', '=', $id,) ->orwhere('user_id', '=', 2) ; // ②クエリとバインドデータの出力 dd($query->toSql(), $query->getBindings()); } } |
出力画面
こちらはクエリ実行前なので処理時間は取得できません。
ただし、クエリ実行前に出力させたいということがあれば、こちらを使うしかありません。
まとめ
・enableQueryLogメソッドとgetQueryLogメソッドはクエリ実行前後に挟んで使えて便利。
また、処理時間も表示できる。
・toSqlメソッドとgetBindingsメソッドはクエリ実行前である必要があれば使用する。