Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana untuk mencetak pernyataan SQL yang dilaksanakan dalam laravel (dua kaedah)

Bagaimana untuk mencetak pernyataan SQL yang dilaksanakan dalam laravel (dua kaedah)

PHPz
PHPzasal
2023-04-09 09:30:016113semak imbas

Adalah perkara biasa untuk menggunakan Eloquent ORM untuk menanyakan pangkalan data dalam Laravel, tetapi apabila kita menghadapi beberapa keperluan pertanyaan yang kompleks, kita perlu nyahpepijat dengan melihat penyata SQL yang dilaksanakan Jadi bagaimana untuk mencetak penyataan SQL yang dilaksanakan?

Laravel menyediakan dua cara untuk mencetak pernyataan SQL yang dilaksanakan, satu melalui output log dan satu lagi melalui pencetakan pendengar acara.

Melalui output log

Melaksanakan pernyataan SQL melalui output log dalam Laravel ialah cara yang paling mudah, dan terdapat kaedah pengelogan dan tontonan yang sepadan dalam setiap persekitaran.

Kami boleh menghidupkan pengelogan pernyataan SQL dalam fail konfigurasi:

// 在config/database.php文件中,找到default下的connections数组,增加以下选项:
'log_queries' => true,  // 开启SQL日志记录
'log_channel' => 'daily', // 日志存储方式,也可使用syslog、errorlog等方式
'log_level' => 'debug', // 日志级别

Selepas menambah pilihan log_queries, Laravel secara automatik akan merekodkan pernyataan SQL yang dilaksanakan, dan log akan dikeluarkan ke direktori storan/log Bawah.

Selepas melaksanakan pernyataan pertanyaan dalam kod, kami boleh mengeluarkan pernyataan SQL dengan cara berikut:

DB::enableQueryLog();
// 执行查询语句
$users = DB::table('users')->get();
// 获取执行的SQL语句
$sql = DB::getQueryLog()[0]['query'];

Dalam kod di atas, mula-mula panggil kaedah DB::enableQueryLog() untuk mendayakan penyata SQL log, selepas melaksanakan pertanyaan, anda boleh mendapatkan semua penyata SQL yang dilaksanakan melalui kaedah DB::getQueryLog() Jika anda ingin mendapatkan penyataan SQL terakhir, anda juga boleh menggunakan kaedah DB::getLastQuery(). .

Walau bagaimanapun, perlu diingatkan bahawa menggunakan kaedah ini untuk merekodkan sejumlah besar pernyataan SQL dalam persekitaran pengeluaran akan meningkatkan volum log, yang tidak kondusif untuk penyelenggaraan sistem dan penyelesaian masalah, oleh itu, jangan kerap merekodkan Penyata SQL dalam persekitaran pengeluaran log.

Melalui pendengar acara

Laravel menyediakan cara untuk mendengar peristiwa pelaksanaan SQL Pembangun boleh mengeluarkan pernyataan SQL dengan mendengar peristiwa pelaksanaan SQL Kaedah ini lebih selamat dan tidak akan digunakan dalam pengeluaran. Sebilangan besar kayu balak dijana dalam persekitaran.

Dengan mentakrifkan pendengar, pernyataan SQL yang sepadan boleh dicetak apabila melaksanakan sebarang pernyataan pertanyaan. Berikut ialah kod pelaksanaan:

// 在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);
});

Dalam kod di atas, kami menggunakan DB::listen() untuk mendaftarkan pendengar acara, yang akan dicetuskan apabila sebarang pernyataan pertanyaan dilaksanakan.

Dalam pendengar, pernyataan SQL pertanyaan semasa dan parameter pengikatan yang berkaitan serta maklumat lain diperoleh melalui acara QueryExecuted, dan kemudian output ke log melalui kaedah Log::debug().

Melalui dua kaedah di atas, kami telah mencapai tujuan mencetak pernyataan SQL dalam Laravel, yang boleh menjadikan penyahpepijatan dan penyelesaian masalah lebih mudah, serta memainkan peranan yang tidak boleh digantikan dalam pembangunan.

Atas ialah kandungan terperinci Bagaimana untuk mencetak pernyataan SQL yang dilaksanakan dalam laravel (dua kaedah). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn