Tinker で実際に SQL を確認したくなったので、少し調べた。
flushQueryLog() が地味に便利かもしれない。
環境
- Laravel 7.20.0
- PHP 7.4.7
- MySQL 5.7.29
前提
Tinker でいろいろ試しながらログを確認したい という場合を想定している。
手順
$ php artisan tinker
Psy Shell v0.10.4 (PHP 7.4.7 — cli) by Justin Hileman
>>> DB::logging();
=> false
>>> DB::enableQueryLog();
=> null
>>> DB::logging();
=> true
>>> App\Memo::find(1);
=> App\Memo {#3940
id: 1,
title: "タイトル1",
body: "本文1",
is_published: 1,
created_at: "2020-07-18 13:26:37",
updated_at: "2020-07-18 13:26:37",
}
>>> dump(DB::getQueryLog()) && DB::flushQueryLog();
array:1 [
0 => array:3 [
"query" => "select * from `memos` where `memos`.`id` = ? limit 1"
"bindings" => array:1 [
0 => 1
]
"time" => 103.03
]
]
=> false
説明
-
DB::logging()- 現在のログ出力設定を確認する
-
true: ログ出力が ON である -
false: ログ出力が OFF である
-
- 現在のログ出力設定を確認する
-
DB::enableQueryLog()- ログ出力を ON にする
- OFF に戻す場合は
DB::disableQueryLog()を使う
-
dump(変数)- 変数の中身を表示する( マニュアル )
-
DB::getQueryLog()- ログを取得する
-
DB::flushQueryLog()- ログの中身を空っぽにする
蛇足
dd(DB::getQueryLog()) としている記事をよく見かけるけど、 dd() は Tinker を終了させるので、Tinker でいろいろ試したい人にはあんまり向かないように思う。
なので、 dd() のかわりに dump() を使っている。
また、デフォルトでは getQueryLog() をしてもログは消えないけど、連続で確認する場合、一度画面に表示したログは不要だろう。
なので、以下のように、 dump() したら速やかに flushQueryLog() を実行してログを空っぽにしている。
dump(DB::getQueryLog()) && DB::flushQueryLog();