2016-09-09 89 views
0

时laravel做出新的查询,如果我得到用户的公司名称是这样的:什么时候变得关系

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

如果我在同一个函数多次做到这一点,它才有了关系,剩下的一个查询它使用第一次检索到的值。

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

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

回答

1

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

例如,如果您有相关的Genre模型(电影belongsTo流派,流派hasMany电影)一个Movie模型。如果你有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'])

编辑以下澄清:

然后,您可以使用一个中间件,这将载入您的通用数据。全局注册该中间件,以便可以为所有请求执行该中间件。

如果需要,可以创建一个额外的外观和一种全局数据管理器,以便稍后提供该数据。

+0

感谢您的回答,但我的问题不是急于加载。我很了解它并使用它很多。但问题是,如何避免多次执行SAME查询。用户很多的东西,比如用户公司,用户标签,用户设置。我的应用程序的许多部分可能需要的数据,但每次在我的应用程序的不同部分中创建新查询都会浪费资源。 – user1365447

+0

编辑答案。中间件是要走的路。 –

+0

有趣的想法,谢谢。 – user1365447