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

时间:2016-09-15 08:49:54

标签: php laravel eloquent

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

让我们说我已经定义了一个关系,其中每个Post都有一个Author,而Post类有一个方法来获取与之关联的作者对象:

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

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

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

2 个答案:

答案 0 :(得分:3)

这个问题,以及一些例子,都是完整记录的right here

提到:

  

访问Eloquent关系时   属性,关系数据是“延迟加载”。这意味着   在您首次访问关系数据之前,实际上并未加载关系数据   属性。

你可以

  

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

因此,当您致电$post->author时,您只进行一次查询,并重新使用之前查询中的相同数据。

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

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

所有数据都将被急切加载,并且只有一个已执行的查询。

答案 1 :(得分:1)

来自Laravel文档。

  

当访问Eloquent关系作为属性时,关系   数据是&#34;延迟加载&#34;。这意味着关系数据不是   实际加载,直到您第一次访问该属性。

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