Trong câu lệnh Query Builder , bạn có thể nhận được câu lệnh SQL bằng cách gọi phương thức toSql() và phương thức getBindings() để nhận giá trị của nó.
I, Khi bạn muốn chuyển đổi Query Builder sang SQL
1 2 3 4 |
php artisan tinker $query = \App\User::where('id', 1); dd($query->toSql(), $query->getBindings()); |
Kết quả
1 2 3 4 |
"select * from `users` where `id` = ?" array:1 [ 0 => 1 ] |
II, Khi bạn muốn kiểm tra SQL của nhiều Query Builders
Để show nhiều Query Builder 1 lúc , các bạn làm theo cách sau:
1 2 3 |
\DB::enableQueryLog(); \App\Models\User::all(); dd(\DB::getQueryLog()); |
Kết quả
1 2 3 4 5 6 7 |
array:1 [ 0 => array:3 [ "query" => "select * from `users`" "bindings" => [] "time" => 1.4 ] ] |
III, Đăng ký với nhà cung cấp dịch vụ và tự động xuất ra tệp nhật ký
Cách này chúng ta sẽ xây dựng 1 Service Provider để tự động ghi log vào file laravel.log.
1, Tạo một Service Provider có tên là DataBaseQueryServiceProvider
1 |
php artisan make:provider DataBaseQueryServiceProvider |
2, Nội dung file app/Providers/DataBaseQueryServiceProvider.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php namespace App\Providers; use Carbon\Carbon; use DateTime; use Illuminate\Database\Events\TransactionBeginning; use Illuminate\Database\Events\TransactionCommitted; use Illuminate\Database\Events\TransactionRolledBack; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; class DataBaseQueryServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register(): void { if (config('logging.enable_sql_log') === false) { return; } DB::listen(function ($query) { $sql = $query->sql; foreach ($query->bindings as $binding) { if (is_string($binding)) { $binding = "'{$binding}'"; } elseif ($binding === null) { $binding = 'NULL'; } elseif ($binding instanceof Carbon) { $binding = "'{$binding->toDateTimeString()}'"; } elseif ($binding instanceof DateTime) { $binding = "'{$binding->format('Y-m-d H:i:s')}'"; } $sql = preg_replace("/\?/", $binding, $sql, 1); } Log::debug('SQL', ['sql' => $sql, 'time' => "$query->time ms"]); }); Event::listen(TransactionBeginning::class, function (TransactionBeginning $event) { Log::debug('START TRANSACTION'); }); Event::listen(TransactionCommitted::class, function (TransactionCommitted $event) { Log::debug('COMMIT'); }); Event::listen(TransactionRolledBack::class, function (TransactionRolledBack $event) { Log::debug('ROLLBACK'); }); } } |
3, Cấu hình file config/logging.php
1 2 3 4 5 6 7 8 9 |
return [ /* | ------------------------------------------------- ------------------------- | Custom Log | ------------------------------------------------- ------------------------- * / 'enable_sql_log' => env('ENABLE_SQL_LOG', false), ]; |
4, Cấu hình ENV
1 |
ENABLE_SQL_LOG=true |
IV, Thực hiện test
1, Bổ sung vào nội dung file routes/web.php đoạn code sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php use App\User; use Illuminate\Support\Facades\DB; Route::get('/', function () { $user = DB::transaction(function () { $user = factory(User::class)->create(); $user->name = 'change name'; $user->save(); $user->delete(); return factory(User::class)->create(); }); User::find($user->id); return view('welcome'); }); |
2, Kiểm tra nội dung file storage/logs/laravel-***.log
1 2 3 4 5 6 7 |
[2020-06-08 04:15:55] local.DEBUG: START TRANSACTION [2020-06-08 04:15:55] local.DEBUG: SQL {"sql":"insert into `users` (`name`, `email`, `email_verified_at`, `password`, `remember_token`, `updated_at`, `created_at`) values ('Philip Bahringer', 'donnell98@example.net', '2020-06-08 04:15:55', 'yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'PBLNzyM7VL', '2020-06-08 04:15:55', '2020-06-08 04:15:55')","time":"0.42 ms"} [2020-06-08 04:15:55] local.DEBUG: SQL {"sql":"update `users` set `name` = 'change name', `users`.`updated_at` = '2020-06-08 04:15:55' where `id` = 1","time":"0.26 ms"} [2020-06-08 04:15:55] local.DEBUG: SQL {"sql":"delete from `users` where `id` = 1","time":"0.34 ms"} [2020-06-08 04:15:55] local.DEBUG: SQL {"sql":"insert into `users` (`name`, `email`, `email_verified_at`, `password`, `remember_token`, `updated_at`, `created_at`) values ('Mrs. Lia Buckridge Sr.', 'florence.metz@example.org', '2020-06-08 04:15:55', 'yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Qt7op6m3CE', '2020-06-08 04:15:55', '2020-06-08 04:15:55')","time":"0.19 ms"} [2020-06-08 04:15:55] local.DEBUG: COMMIT [2020-06-08 04:15:55] local.DEBUG: SQL {"sql":"select * from `users` where `users`.`id` = 2 limit 1","time":"0.49 ms"} |