先日、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

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

By khino