Laravel Eager加载并动态绑定模型关系

时间:2016-12-19 19:09:49

标签: laravel-5 orm model eloquent

Laravel版本: 5.3

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

User::hasOneRelation('App\Client')->first();

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

{hostname, exit_status} = System.cmd "hostname", [""]
{"TR01PPL010698\r\n", 0}

我得到了正确的值但是有任何N + 1问题.....

3 个答案:

答案 0 :(得分:1)

没有办法急于加载这种动态关系,所以如果你试图在循环中使用这种关系,是的,你最终会遇到N + 1问题。

答案 1 :(得分:0)

你不应该在这里遇到任何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'));
}

答案 2 :(得分:-1)

是的,你只是面临N + 1问题。阅读laravel官方文档https://laravel.com/docs/5.3/eloquent-relationships#eager-loading