laravel是否缓存所有查询结果?

时间:2017-12-26 14:06:28

标签: php laravel eloquent

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)

2 个答案:

答案 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个查询