像belongsTo这样的Laravel关系方法总是查询数据库


Do Laravel relationship methods like belongsTo always query the database?

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

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

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>

这个问题和例子在这里都有完美的记录。

其中提到:

访问Eloquent关系时属性时,关系数据是"延迟加载"的。这意味着关系数据实际上不会加载,直到您第一次访问财产。

你可以

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


因此,当您调用$post->author时,您只进行一次查询,并重用来自前一次查询的相同数据。

然而,如果你也做了同样的事情,比如说,多个帖子并循环查询它们的作者,每个请求都将是一个新的查询。除非模型具有protected $with = ['author']属性,或者查询中包含了一个with以主动加载它。

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

所有的数据都是动态加载的,并且只执行一个查询。

来自Laravel文档

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

但是它会在每次访问属性时加载,所以,为了避免多次查询(N+1的问题),如果你知道你要访问属性,就立即加载它