laravel / eloquent是否记得以前的查询结果,或者是否存在性能影响我多次访问相关模型而不是将值放入变量中:
$user = User::find(1);
doSomething($user->relation->id)
doSomethingElse($user->relation->id)
VS
$user = User::find(1);
$relatedModelId = $user->relation->id
doSomething($relatedModelId)
doSomethingElse($relatedModelId)
答案 0 :(得分:0)
如果您只使用一个具有关系的对象,则无需更改代码。
但是如果您正在加载具有关系的对象集合,则需要使用预先加载来避免N + 1问题。
当访问Eloquent关系作为属性时,关系数据是“延迟加载”。这意味着在您首次访问该属性之前,实际上不会加载关系数据。但是,Eloquent可以在您查询父模型时“急切加载”关系。急切加载缓解了N + 1查询问题。
https://laravel.com/docs/5.5/eloquent-relationships#eager-loading
因此,使用with()
方法预加载所有相关数据:
$users = User::with('relation')->get();
答案 1 :(得分:0)
Eloquent缓存关系,因此您不需要像显示的那样为变量分配关系。请记住使用有效的关系情况 - 否则每次执行新查询时都会执行:
$user = User::find(1);
doSomething($user->relation->id);
doSomethingElse($user->relation->id);
只会对关系执行单个查询,但
$user = User::find(1);
doSomething($user->relation->id);
doSomethingElse($user->RELATION->id);
可能会为此关系执行2个查询