[翻譯] 快速匯出 Laravel 的查詢語句

茄子發表於2017-01-24

Eloquent 是處理關係模型的神兵利器。你可以用它設計模型,緩載入子記錄。

例如,假設你需要獲取一個使用者:

User::where('name', 'Eric')->first();

然後在檢視中可能有以下操作:

@foreach ($user->posts as $post)

因為 posts 在初始載入時沒有包含 User Eloquent,所以需要為每一條記錄再執行一次查詢,以取出關聯的 User 。

解決方案如下:

User::where('name', 'Eric')->with('posts')->first();

為了對查詢效率保持警覺,你可能會在本地開發環境啟用 Laravel Debugbar 或者 Laravel database profiler 這兩個重型工具,它們會列印所有的查詢語句,並且在超出控制時給你提醒。

不過,在 Reddit 的 Laravel 頻道上,使用者 magkopian 共享了另一種 快速的解決方案,以檢視頁面上所有執行的查詢。

在 AppServiceProvider.php 的 boot 方法中新增如下內容:

use DB;
use Event;

//..

public function boot()
{
    if (env('APP_ENV') === 'local') {
        DB::connection()->enableQueryLog();
        Event::listen('kernel.handled', function ($request, $response) {
            if ( $request->has('sql-debug') ) {
                $queries = DB::getQueryLog();
                dd($queries);
            }
        });
    }
}

現在,你在開發時往任何 URL 後追加 ?sql-debug=1 ,就可以列印出所有查詢。

讓我們再做個小小的改進,使用幫助函式 dump 替換掉 dd ,以獲得格式更友好的輸出:
file

看起來似乎不那麼優雅,但是當我想看看特定頁面究竟發生了什麼,又不想安裝專用的包的時候,這個技巧很好的解決了問題。

Night gathers, and now my watch begins.

相關文章