【问题标题】:When does laravel make a new query when getting relationlaravel 获取关系时何时进行新查询
【发布时间】:2016-09-11 14:35:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: laravel-5


    【解决方案1】:

    使用 Eloquent 时,如果您有一个模型与另一个模型相关,您可以预先加载相关模型以尽量减少查询次数。

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

    编辑以下说明:

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

    如果需要,制作一个额外的外观和一种全局数据管理器,以便以后可以使用该数据。

    【讨论】:

    • 感谢您的回答,但我的问题不是急切加载。我很清楚它并经常使用它。但是,问题是,如何避免多次进行 SAME 查询。经常使用的东西,比如用户公司、用户标签、用户设置。我的应用程序的许多部分可能需要数据,但每次在我的应用程序的不同部分进行新查询感觉就像在浪费资源。
    • 编辑了答案。中间件是要走的路。
    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2019-03-28
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多