ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> ## 关联预载入 > 描述:将N+1次查询优化为两次查询,提高查询性能,一对一关联只需查询一次,一对多关联只需查询两次 ``` // 一对一关联预载入支持两种方式:join:0和in:1 class User extends Model { public function profile() { // 设置预载入查询方式为IN方式 return $this->hasOne('Profile')->setEagerlyType(1); // 设置预载入查询方式为JOIN方式 return $this->hasOne('Profile')->setEagerlyType(0); } } // 没有用到关联预载入(查询4次) $list = User::all([1,2,3]); // 一次查询 (id in (1,2,3) foreach($list as $user){ // 三次查询 (根据user_id查出profile) // 获取用户关联的profile模型数据 dump($user->profile); } // 关联预载入方式(查询2次) $list = User::with('profile')->select([1,2,3]); (2次查询,一:id in (1,2,3) 二:user_id in (1,2,3)) foreach($list as $user){ // 获取用户关联的profile模型数据 dump($user->profile); } // 同样的也可以使用get和all方法进行预载入,如 $list = User::all([1,2,3],'profile,book'); // 指定查询的字段 $list = User::field('id,name')->with(['profile'=>function($query){$query->field('email,phone');}])->select([1,2,3]); // 预载入多个关联 $list = User::with('profile,book')->select([1,2,3]); // 嵌套预载入(远程一对多关联) $list = User::with('profile.phone')->select([1,2,3]); foreach($list as $user){ // 获取用户关联的phone模型 dump($user->profile->phone); } // 如果要获取子模型关联的多个子模型(可以传入子模型的子模型数组) $list = User::with(['profile'=>['phone','job','img']])->select([1,2,3]); foreach($list as $user){ // 获取用户关联 dump($user->profile->phone); dump($user->profile->job); dump($user->profile->img); } // 关联预载入的方法名支持用小写字母+下划线定义 $list = User::with('userProfile,userBook')->select([1,2,3]); 等效于 $list = User::with('user_profile,user_book')->select([1,2,3]); ```