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 協議》,轉載必須註明作者和本文連結