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 ,以獲得格式更友好的輸出:
看起來似乎不那麼優雅,但是當我想看看特定頁面究竟發生了什麼,又不想安裝專用的包的時候,這個技巧很好的解決了問題。
本作品採用《CC 協議》,轉載必須註明作者和本文連結