Laravel 8 新增功能之如何驗證N+1查詢

24K大白羊發表於2021-06-02

PR 地址:github.com/laravel/framework/pull/...

Laravel 的 Eloquent ORM 是非常方便和強大的,只要在模型層做好相關配置和關聯,就可以非常方便的進行查詢。
但是,這無意也會給程式效能帶來隱患,比如查詢 N+1的問題。

舉個例子:
使用者可以發表多篇博文,那麼 UserModel 和 PostModel 的關係就是 1對多的關係。

// User Model
public function posts()
{
    return $this->hasMany(Post::class);
}

// UserController
// 查詢一個使用者
$users = User::get();
// 查詢該使用者的所有博文
foreach($users as $user) {
    $user->posts;
}

上面的程式碼就存在N+1查詢的問題,應該儘量避免這種問題。如果發現呢?現在可以在 AppServiceProvider 中進行如下設定:

// User Model
public function boot()
{
    Model::preventLazyLoading(! app()->isProduction());
}

這樣在有 N+1 風險的時候,就會丟擲 Illuminate\Database\LazyLoadingViolationException 異常,然後再根據異常資訊去解決就可以了,例如使用:

$users = User::with('posts')->get();

foreach($users as $user) {
    $user->posts;
}

with 是為了解決 N+1 而生的。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章