ホームページ  >  記事  >  PHPフレームワーク  >  laravelで実行されたSQL文を出力する方法(2つの方法)

laravelで実行されたSQL文を出力する方法(2つの方法)

PHPz
PHPzオリジナル
2023-04-09 09:30:016113ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。