laravel什么时候在获得关系

时间:2016-09-09 09:57:27

标签: laravel-5

如果我得到这样的用户公司名称:

Auth::users()->company->name

如果我在同一个函数上多次执行,它只会对关系进行一次查询,其余的则使用第一次检索的值。

我想知道,这有多深,是否有可能让它更深入。例如,如果我在控制器中使用它,然后再在视图中使用它,它是否会创建一个新查询?我怎样才能使它每次请求只能进行一次相同的查询(页面视图)?

澄清: 问题不是急切加载。问题是如何避免多次进行SAME查询。用户公司,用户标签,用户设置等经常使用的东西。我应用程序的许多部分可能需要的数据,但每次在我的应用程序的不同部分进行新查询都会浪费资源。

1 个答案:

答案 0 :(得分:1)

使用Eloquent时,如果您有与另一个模型相关的模型,您可以急切加载相关模型,以便最大限度地减少查询次数。

例如,如果您有Movie模型与Genre模型相关(电影belongsTo类型,类型hasMany电影)。如果你有10部电影:

$movies = Movie::all();
foreach ($movies as $m) echo $m->genre->name;
// 11 queries are gemerated (get all + 1 per item)

然而:

$movies = Movie::with('genre')->get();
foreach ($movies as $m) echo $m->genre->name;
// 2 queries are gemerated (get all movies + get all genres for those movies)

请注意,您可以急切加载多个和/或嵌套关系。

例如:with(['genre', 'actors', 'actors.profile'])

编辑以下说明:

然后,您可以使用将加载公共数据的中间件。全局注册该中间件,以便可以对所有请求执行。

如果需要,请制作一个额外的外观和一种全局数据管理器,以便以后提供这些数据。