先日、tinkerに関して私が知らなかった機能を見つけました。tinkerを好んで日夜使用する私としては、これは作業効率が上がるわ、とわくわくする機能です。
tinkerで私がよく使うのは、以下のようなEloquentの関数で実行される裏側のSQL文の表示です。
Psy Shell v0.9.3 (PHP 7.1.14 — cli) by Justin Hileman >>> DB::enableQueryLog() => null >>> User::find(1) [!] Aliasing 'User' to 'App\User' for this Tinker session. => App\User {#2316 id: 1, name: "江古田 明美", email: "kazuya24@example.net", created_at: "2019-01-18 14:02:42", updated_at: "2019-01-18 14:02:42", } >>> DB::getQueryLog() => [ [ "query" => "select * from `users` where `users`.`id` = ? limit 1", "bindings" => [ 1, ], "time" => 8.01, ], ] >>>
この例ではシンプルなSQL文ですが、これがhasManyThroughとかbelongsToManyだとかの複雑なリレーションになると、joinの接続が本当にこちらの期待通りなのか、などのチェックしたくなります。しかし、
DB::enableQueryLog()
やDB::getQueryLog()
を覚えるのも大変であるし、毎回毎回それをタイプするのも面倒!
なんか簡単にエイリアスみたいなことができないかと、探していてわかったのが、tinkerのブートストラップファイル。
まず、以下の内容のPHPファイルを作成します。
<?php DB::enableQueryLog(); function sql() { return DB::getQueryLog(); }
そして、そのファイル名を引数として、tinkerを実行します。
$ php artisan tinker start.php [bash] Psy Shell v0.9.3 (PHP 7.1.14 — cli) by Justin Hileman >>> User::find(1) [!] Aliasing 'User' to 'App\User' for this Tinker session. => App\User {#2316 id: 1, name: "江古田 明美", email: "kazuya24@example.net", created_at: "2019-01-18 14:02:42", updated_at: "2019-01-18 14:02:42", } >>> sql() => [ [ "query" => "select * from `users` where `users`.`id` = ? limit 1", "bindings" => [ 1, ], "time" => 8.01, ], ] >>>
そう、start.phpはすでにtinker内で先に実行されるので、SQLのログ機能はすでにオンとなっているし、SQL文を見たいときは、sql()
とだけタイプすればいいのです。これなら忘れませんね。