首先,抱歉我的英语不好。
我有Eloquent查询
$gigs = Gig::active()
->plusGigs()
->with('member')
->paginate(16);
我的模特中有功能
public function member()
{
return $this->belongsTo('App\User', 'USERID', 'USERID')
->select(array(
'USERID',
'username'
))
}
当我尝试在我的视图文件上使用时
{{ $gig->member->username }}
耶。它有效但如果我不使用' with('member')
'在我的Eloquent查询中
它仍然有效{{ $gig->member->username }}
为什么我需要使用' with
'在我的雄辩中?
感谢。
答案 0 :(得分:2)
当您使用with
时,laravel知道也会在两个查询中预取相关的members
,而不是多个查询。这称为Eager Loading。
所以,查询听起来像, "获取数据库的所有演出。" "获得所有这些演出的成员。"
所有这些仅在两个查询中。
如果在不使用with
关键字的情况下运行它,laravel每次执行{{ $gig->member->username }}
时都需要点击一个新的数据库查询。这被称为(n+1) problem。因为,您需要(n + 1)个新查询才能从数据库中获取相关数据(' n'是您案例中的演出数量。)
在这种情况下查询听起来像, "获得所有的演出。"
然后,每当查询听起来像是在循环播放时,
"获取演出1"
的成员"获取演出2"
的成员"获取gig n"
的成员由于数据库查询在服务器上是一个昂贵的负载并导致时间延迟,因此您需要尽可能地减少这些负担。对于少量项目,时间延迟可以忽略不计,但遵循最佳实践总是好的。