我只想更好地了解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>
答案 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问题),如果您知道要访问该属性,请急切加载它。