1、在普通的关联查询下,我们循环数据列表会执行n+1次sql查询
$list = UserModel::select([19, 20, 21]);
foreach ($list as $user) {
dump($user->profile);
}
2、采用关联预载入的方式,会执行两次查询
$list=Students::with(['stumenu'])->select([1,2,3]);
foreach($list as $user){
dump($user->stumenu);
}
3、关联预载入减少了查询次数提高了性能,但是不支持多次调用
4、如果主表关联了多个附表,都要进行预载入,可以传入多个模型方法
$list=Students::field('id','username')->with(['stumenu'=>function ($query){
$query->filed('user_id,sex');
])->dump($user->stumenu.$user->sex);
}
5、如果想要在关联模型实现链式操作,可以使用闭包,比如添加->field()
$user = Students::field('id,username')->with(['profile'=>function ($query) {
$query->field('user_id, hobby');
}])->select([19,20,21]);
6、关联预载入还提供了一个延迟预载入,就是先执行select()再load()载入
$list = UserModel::select([19, 20, 21]);
$list->load(['profile']);
foreach ($list as $user) {
dump($user->profile
);
}