先日、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()とだけタイプすればいいのです。これなら忘れませんね。
