Laravel Eager Loading 和动态绑定模型关系

Posted

技术标签:

【中文标题】Laravel Eager Loading 和动态绑定模型关系【英文标题】:Laravel Eager Loading and dynamically bind model relationship 【发布时间】:2016-12-19 19:09:49 【问题描述】:

Laravel 版本:5.3

在我的 User 模型类中,我有一个类似的方法:

public function hasOneRelation($model)

    return $this->hasOne($model);

然后我像下面的代码一样调用这个方法:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

始终欢迎提供指向潜在解决方案的链接,但请add context around the link,以便您的其他用户知道它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。考虑到仅仅是指向外部站点的链接是Why and how are some answers deleted? 的一个可能原因。

以上是关于Laravel Eager Loading 和动态绑定模型关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - Eager Loading BelongsToMany 关系

Laravel Eloquent Eager Loading:加入同一张表两次

Laravel Eager Loading - 仅加载特定列

Laravel:Eloquent Eager Loading 关系的选择

Laravel Eager Loading 删除子项的空值

Laravel Eager Loading 在单个注入模型上