前言

LaravelORM 是相当好用的。

同时,因为 Laravel 内部帮我们做了不少东西,很多操作都是无感知的,只知道输入什么,输出什么。

有时候,为了能够更好的分析问题,我们需要通过一些运行日志来帮助我们。

方法1

官方推荐 传送门

  1. <?php
  2. namespace App\Providers;
  3. use Illuminate\Support\Facades\DB;
  4. use Illuminate\Support\ServiceProvider;
  5. class AppServiceProvider extends ServiceProvider
  6. {
  7. /**
  8. * Register any application services.
  9. *
  10. * @return void
  11. */
  12. public function register()
  13. {
  14. //
  15. }
  16. /**
  17. * Bootstrap any application services.
  18. *
  19. * @return void
  20. */
  21. public function boot()
  22. {
  23. DB::listen(function ($query) {
  24. Log::info($event->sql . ' bind: ' . json_encode($event->bindings));
  25. });
  26. }
  27. }

方法2

使用 EventServiceProvider 注册。

<?php

namespace App\Providers;

use App\Listeners\QueryListener;
use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        QueryExecuted::class => [
            QueryListener::class
        ],
    ];
}

实现 QueryListener

<?php
namespace App\Listeners;

use Illuminate\Support\Facades\Log;
use Illuminate\Database\Events\QueryExecuted;

/**
 * Log Query
 */
class QueryListener
{
    /**
     * Handle the event.
     *
     * @param  QueryExecuted $event
     * 
     * @return void
     */
    public function handle(QueryExecuted $event)
    {
        if (!$event->sql) {
            return;
        }
        Log::info($event->sql . ' bind: ' . json_encode($event->bindings));
    }
}

最终的结果是一致的。

最后

终于可以看到执行的 SQL 了,也可以根据 SQL 来了解 Laravel 大致的一个实现方式。