Help us understand the problem. What is going on with this article?

[Laravel 5.8] デバッグに便利なメソッドまとめ

More than 1 year has passed since last update.

SQL系

toSql()

クエリビルダの作成されるSQL文を確認する。

>>> User::where('id', 1)->toSql();
=> "select * from `users` where `id` = ?"

クエリビルダ以外で使おうとするとエラーだったり、戻り値が想定とは異なってくる。

>>> User::all()->toSql();
// BadMethodCallException with message 'Method Illuminate/Database/Eloquent/Collection::toSql does not exist.'

>>> User::find(1)->toSql();
=> "select * from `users`"
// find()のSQLではない
// $user = new User(); $user->toSql();の結果と同じ

DB::enableQueryLog(), DB::pretend()

バインディングしている値も確認できる。

// QueryLog
\DB::enableQueryLog();
User::all();
User::find(1);
\DB::getQueryLog();

// またはpretend
\DB::pretend(function () {
    User::all();
    User::find(1);
});

// どちらも以下が返される。
=> [
     [
       "query" => "select * from `users`",
       "bindings" => [],
       "time" => 1.21,
     ],
     [
       "query" => "select * from `users` where `users`.`id` = ? limit 1",
       "bindings" => [
         1,
       ],
       "time" => 1.18,
     ],
   ]

dump, log系

dump()

変数をdumpする。php標準のvar_dump()より見やすい。

>>> dump([1,2,3]);
array:3 [
  0 => 1
  1 => 2
  2 => 3
]

>>> var_dump([1,2,3]);
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

// 複数の値を一気に表示できる
>>> dump(1, 2, 3, 4);
1
2
3
4

dd()

dumpした時点で処理を終了する(dump and die)。使い方はdump()と同じ

info(), logger()

ログに書き出す。

info('sample info');
// [2019-04-18 14:15:36] local.INFO: sample info

logger('sample debug');
// [2019-04-18 14:15:45] local.DEBUG: sample debug

logger()->error('sample error');
// [2019-04-18 14:16:37] local.ERROR: sample error

オブジェクトも書き出したいときは、print_r($object, true)とする。

logger(new App\Eloquent\User);
// [2019-04-18 14:19:18] local.DEBUG: []

logger(print_r(new App\Eloquent\User, true));
// [2019-04-18 14:19:31] local.DEBUG: App\Eloquent\User Object
// ...(オブジェクトの情報)

[おまけ] dump-server

dump情報をターミナルで表示できる。まずは起動する。
dump-serverを起動しておくと、ビューではdump情報が表示されなくなります

$ php artisan dump-server

以下のようにdump()しておき・・・

routes/web.php
Route::get('/', function () {
    dump(User::where('id', 1)->toSql());
    return view('welcome');
});

/にアクセスすると、ターミナルで以下のように表示してくれる。

GET http://localhost/
---------------------

 ------------ --------------------------------- 
  date         Thu, 18 Apr 2019 15:47:22 +0900  
  controller   "Closure"                        
  source       web.php on line 49               
  file         routes/web.php                   
 ------------ --------------------------------- 

"select * from `users` where `id` = ?"
fork
株式会社フォークは、Webサイトの企画・制作・開発・サーバホスティング・コンタクトセンターを一社に集約したワンストップソリューションを展開する制作会社です。
https://www.fork.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away