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 - 仅加载特定列