Eloquent ORM を使用して Laravel でデータベースにクエリを実行するのは一般的ですが、複雑なクエリ要件に直面した場合は、実行された SQL ステートメントを表示してデバッグする必要があります。では、実行された SQL ステートメントを出力するにはどうすればよいでしょうか?
Laravel は、実行された SQL ステートメントを出力する 2 つの方法を提供します。1 つはログ出力を使用する方法、もう 1 つはイベント リスナーの出力を使用する方法です。
Laravel のログ出力を通じて SQL ステートメントを実行するのが最も便利な方法であり、各環境に対応するログの記録方法と表示方法があります。
設定ファイルで SQL ステートメントのログをオンにすることができます:
// 在config/database.php文件中,找到default下的connections数组,增加以下选项: 'log_queries' => true, // 开启SQL日志记录 'log_channel' => 'daily', // 日志存储方式,也可使用syslog、errorlog等方式 'log_level' => 'debug', // 日志级别
log_queries オプションを追加すると、Laravel は実行された SQL ステートメントを自動的に記録し、ログはstorage/logs ディレクトリ。
コード内のクエリ ステートメントを実行した後、次の方法で SQL ステートメントを出力できます。
DB::enableQueryLog(); // 执行查询语句 $users = DB::table('users')->get(); // 获取执行的SQL语句 $sql = DB::getQueryLog()[0]['query'];
上記のコードでは、まず DB::enableQueryLog() メソッドを呼び出して有効にします。 SQL ステートメントの記録 、クエリの実行後、DB::getQueryLog() メソッドを通じて実行されたすべての SQL ステートメントを取得できます。最後の SQL ステートメントを取得したい場合は、DB::getLastQuery() メソッドを使用することもできます。 。
ただし、本番環境でこの方法を使用して大量の SQL ステートメントを記録すると、ログの量が増加し、システムのメンテナンスやトラブルシューティングに役立たないことに注意してください。運用環境で SQL ステートメントを頻繁に記録するステートメント ログ。
Laravel は SQL 実行イベントをリッスンする方法を提供します。開発者は SQL 実行イベントをリッスンすることで SQL ステートメントを出力できます。この方法はより安全で信頼性が高く、運用環境で使用される環境では、大量のログが生成されます。
リスナーを定義すると、クエリ ステートメントの実行時に、対応する SQL ステートメントを出力できます。実装コードは次のとおりです。
// 在AppServiceProvider的boot方法中,添加以下代码 use Illuminate\Support\Facades\DB; use Illuminate\Database\Events\QueryExecuted; use Log; // 注册SQL执行监听器 DB::listen(function (QueryExecuted $queryExecuted) { $sql = str_replace("?", "'%s'", $queryExecuted->sql); $bindings = $queryExecuted->connection->prepareBindings($queryExecuted->bindings); $fullSql = vsprintf($sql, $bindings); Log::debug('SQL:'.$fullSql); });
上記のコードでは、DB::listen() を使用して、クエリ ステートメントが実行されるとトリガーされるイベント リスナーを登録します。
リスナーでは、現在のクエリの SQL ステートメントと関連するバインディング パラメーターおよびその他の情報が QueryExecuted イベントを通じて取得され、Log::debug() メソッドを通じてログに出力されます。
上記の 2 つの方法により、Laravel で SQL ステートメントを出力するという目的を達成しました。これにより、デバッグとトラブルシューティングがより便利になり、開発においてかけがえのない役割を果たします。
以上がlaravelで実行されたSQL文を出力する方法(2つの方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。