【问题标题】:Do Laravel relationship methods like belongsTo always query the database?Laravel 中的 belongsTo 等关系方法是否总是查询数据库?
【发布时间】:2017-01-23 05:21:44
【问题描述】:

我只是想更好地了解 Laravel 的 Eloquent/Model 是如何处理关系的。

假设我已经定义了一个关系,其中每个 Post 都有一个 Author 并且 Post 类有一个方法来获取与其关联的作者对象:

public function author() {
    return $this->belongsTo( 'App\User', 'author_id' );
}

现在调用帖子的 author() 方法将根据帖子的 author_id 字段返回作者。我的问题是:每次使用该方法时,Laravel 是否都会进行查询?下面的代码会两次从数据库中请求数据吗?

<a href="{{ route('user',$post->author->slug) }}">{{ $post->author->name }}</a>

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    这个问题,有例子,完美记录right here

    其中提到:

    当访问 Eloquent 关系时 属性,关系数据是“延迟加载”的。这意味着 直到您第一次访问 属性。

    你可以

    查询时,您可以指定哪些关系应该是渴望的 使用 with 方法加载:


    因此,当您调用$post-&gt;author 时,您只需进行一次查询,然后重复使用前一个查询中的相同数据。

    但是,如果您也这样做了,比方说,多个帖子并循环通过它们询问他们的作者,每个请求都会是一个新的查询。除非模型具有protected $with = ['author'] 属性或查询中包含 with 以急切地加载它。

    $post = App\Post::with('author')-&gt;find(2)-&gt;get();

    所有数据都将被预先加载,并且只有一个执行查询。

    【讨论】:

      【解决方案2】:

      来自 Laravel 文档。

      当访问 Eloquent 关系作为属性时,关系 数据是“延迟加载”。这意味着关系数据不是 在您第一次访问该属性之前实际加载。

      但是每次访问该属性时都会加载它,因此,为避免多次查询(N+1 问题),如果您知道要访问该属性,请立即加载它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-22
        • 2019-02-15
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 2019-05-26
        相关资源
        最近更新 更多