Laravel急切的负载和动态结合模型关系



laravel版本: 5.3

在我的中,用户模型类我有一种方法:

public function hasOneRelation($model)
{
    return $this->hasOne($model);
}

然后我称此方法为以下代码:

User::hasOneRelation('AppClient')->first();

我得到了正确的值,但是有任何n 1个问题....

无法急切地加载这种动态关系,因此,如果您尝试在循环中使用这种关系,是的,您最终会遇到n 1问题。

您在这里不应该有任何n 1个问题,因为您不会将其称为模型的属性。那只是远离在模型上循环的循环中。如果您要做:

,就会得到n 1问题。
//User Model
public function contract()
{
    return $this->hasOne(Contract::class);
}
//Controller
public function index()
{
    $users = User::all();
    return view('users.index', compact('users'));
}
//View
<ul>
@foreach($users as $user)
    <li>{{$user->contract->type}}</li>
@endforeach
</ul>

将每个模型上的关系加载在循环中,而不是懒惰的加载如下:

//Controller
public function index()
{
    $users = User::with('contract')->get();
    return view('users.index', compact('users'));
}

是的,您只是面对n 1问题。阅读Laravel官方Doc https://laravel.com/docs/5.3/eloquent-relationships#eager-loading

最新更新