## 关联查询 上一章中,我们已经了解到如何给模型定义关联模型。关联模型的定义,系统有进行处理直接定义成一个数组即可,不用像TP那样定义function。 **但关联查询的方式却和TP一样,没有任何变化。** 先来看下User模型,关联模型的定义: ~~~ public $relationLink = [ //用户组 'UserGroup' => 'belongsTo', //用户信息 'Member' => [ 'type' => 'hasOne', 'deleteWith' => true ] ]; ~~~ ~~~ $user = model('User')->find();//查询一个用户,返回对象 $user->UserGroup;//$user 对象去获取关联模型UserGroup的数据 pr($user->toArray());//返回数组查询结果 //来看下查询结果 Array ( [id] => 1 [username] => eduask [password] => fa2112ee0dae88999a28f19b6a501aa8 [user_group_id] => 1 [status] => verified [email] => [logined_ip] => 127.0.0.1 [logined] => 2017-11-11 17:37:33 [created] => 2017-10-10 11:22:25 [UserGroup] => Array ( [id] => 1 [is_admin] => 1 [title] => 后台管理员 [alias] => Admin ) ) ~~~ ~~~ $users = model('User')->select()->toArray;##查询多个用户,返回一个数组,每个数组元素是一个用户对象 pr($users); ~~~ 所以关联查询的用法和TP本身是一致的。 * * * * * ## 关联预载入 关联预载入的用法和TP本事是一致的 → [TP官方关联预载入](https://www.kancloud.cn/manual/thinkphp6_0/1037605) ~~~ $list = model('User')->withUserGroup')->select(); pr($list); pr($list->toArray()); ~~~ 使用关联预载入更方便、效率更高。 * * * * * 在系统中,关联预载入还支持where、field、order、limit(查询时那些关联操作)等复杂定义,但前提需要将你定义的关联先交给模型方法`parseWith`处理: ~~~ //定义复杂的预载入数组,支持where、filed、limit、order等常用的连贯操作 以关联模型名 => 数组定义 $with = [ 'Member' => [ 'field' => ['id','nickname'] ], 'UserGroup' => [ 'where' => ['id' => ['egt', 1]], 'field' => ['id','title'], 'limit' => 2, 'order' => ['id' => 'DESC'] ] ]; //如果你的with不是第一个连贯操作,那么像上面这样定义的数组必须先交给parseWith处理 $with = model('User')->parseWith($with); $list = model('User')->with($with)->select(); pr($list->toArray()); ~~~ 打印看下SQL语句,里面有你定义的内容: ~~~ [ SQL ] SELECT `id`,`nickname`,`user_id` FROM `eduask_member` WHERE `user_id` IN (1,2,3) [ RunTime:0.000000s ] [ SQL ] SELECT `id`,`title` FROM `eduask_user_group` WHERE ( `id` >= 1 AND `id` IN (1,3) ) ORDER BY `id` DESC LIMIT 2 [ RunTime:0.000000s ] ~~~