# Api开发---单条信息复杂关联显示 我们看一下上一节通过 http://study.mikkle.cn/api/admin_user/adminUserInfo 获取的Json ![](https://box.kancloud.cn/6f9abd3e1be6b11b11dbf78cad043ea7_667x347.png) 这样看感觉乱糟糟的 非常不方便 我们还是用浏览器调试工具查看 > 大部分浏览器都有 按F12打开 ![](https://box.kancloud.cn/8b8638ba0f37bf70d4f162ecfdc2fa56_639x535.png) 在数据中有部门 显示的是id ~~~ "department_id":1 //部门 ~~~ 在现实的查询 使用的都是该部门的中文名字 那我们该如何简单方便的做到 ## 关联显示的实现 我们在控制器中 新建一个 adminUserWithDepartment方法 为了对比两个接口显示的差别 我把上面的方法改动一下 getdata()为获取原信息 ~~~ public function adminUserInfo(){ $open_id='oO059v39zsst76IkuiYV3yMvc4Sw'; $user_info=model('base/AdminUser')->getInfoByOpenid($open_id); return $user_info->getdata(); } public function adminUserWithDepartment(){ $open_id='oO059v39zsst76IkuiYV3yMvc4Sw'; $user_info=model('base/AdminUser')->getInfoByOpenid($open_id); return $user_info->toArray(); } ~~~ 那么我们再去模型添加一个方法 另外再为Department字段做一个获取器 获取器详细的介绍请看官方手册 http://www.kancloud.cn/manual/thinkphp5/135192 ~~~ class AdminUser extends Model { protected $table = "my_admin_user"; public function getInfoByOpenid($open_id){ return $this->where('weixin_openid',$open_id)->find(); } } ~~~ 关联获取前还要建立一个新的模型AdminDepartment ![](https://box.kancloud.cn/8b98e3a425256df23a2c90a334af5cbf_277x250.png) 根据数据库 建立代码如下 注意命名空间 文件名 类名 ~~~ <?php namespace app\base\model; use think\Model; class AdminDepartment extends Model { protected $table = "my_admin_department"; } ~~~ ## 建立关联获取器 我们在AdminUser的model里做一个复杂的关联获取器 ~~~ //方法一 public function getDepartmentIdAttr($value,$data) { return $this->belongsTo('AdminDepartment','department_id','id')->where('id',$value)->value('name'); } //方法二 public function getDepartmentIdAttr($value,$data) { return $this->belongsTo('AdminDepartment','department_id','id')->where('id',$data['department_id'])->value('name'); } ~~~ 好了 现在我们访问 http://study.mikkle.cn/api/admin_user/adminUserWithDepartment ![](https://box.kancloud.cn/acb2b3c5fc714f4cd02b5d86d98608e1_304x143.png) 现在已经显示出来部门是中文的行政部 ~~~ department_id:"行政部" ~~~#### >[info] 关于关联获取器官方并没有这种叫法, 这个方法即用到了获取器 也用的关联 大家也可以尝试一下 一对多的 关联获取器 与获取器还有很多中新玩法 大家以前通过 $value,$data这个两个参数尽情玩耍吧 我看了一下数据库结构 ![](https://box.kancloud.cn/e0721f795eaf2df81875bfb9e896fc25_840x243.png) 这个rule好像是对应 ![](https://box.kancloud.cn/b57cfa94eaeeaf0d36898ef961a24f01_570x677.png) 那我们就玩一个再复杂一点的 ## 复杂的关联 一对多 获取器 老规矩 建立模型 AdminRole和AdminRole #### AdminRole ~~~ <?php namespace app\base\model; use think\Model; class AdminRole extends Model { protected $table = "my_admin_role"; } ~~~ #### AdminNode ~~~ <?php namespace app\base\model; use think\Model; class AdminNode extends Model { protected $table = "my_admin_node"; } ~~~ ~~~ <?php namespace app\base\model; use think\Model; class AdminUser extends Model { protected $table = "my_admin_user"; public function getInfoByOpenid($open_id){ return $this->where('weixin_openid',$open_id)->find(); } public function getDepartmentIdAttr($value,$data) { return $this->belongsTo('AdminDepartment')->where('id',$value)->value('name'); } // 方法一 public function getRoleIdAttr($value,$data){ return $ids = $this->belongsTo('AdminNode')->where('id','in',$this->belongsTo('AdminRole')->where('id',$value)->value('rule'))->select(); } // 方法二 public function getRoleIdAttr($value,$data){ $ids = $this->belongsTo('AdminRole')->where('id',$value)->value('rule') ; return $this->belongsTo('AdminNode')->where('id','in',$ids )->select(); } } ~~~ Ok 那我们看看运行以后的代码 太长 我省略了 ~~~ {"id":1,"department_id":"技术部","jobs_id":0,"weixin_openid":"oO059v39zsst76IkuiYV3yMvc4Sw","banding_code":"55229586246","role_id":[{"id":1,"aid":1,"node_name":"我的组织","module_name":"#","control_name":"#","action_name":"#","is_menu":1,"pid":0,"icon":"fa fa-globe","sort":255,"status":1,"create_time":"1970-01-01 08:00:00","update_time":"1970-01-01 08:00:00","group":null},{"id":2,"aid":1,"node_name":"员工管理","module_name":"admin","control_name":"User","action_name":"user","is_menu":1,"pid":1,"icon":"","sort":3,"status":1,"create_time":"1970-01-01 08:00:00","update_time":"2016-11-07 11:23:37","group":""},..... ~~~ 还是看看浏览器调试上的信息吧 ![](https://box.kancloud.cn/67d4322f7500792b3588a9ffd56b56e4_351x368.png) 至于一些简单的字段调整什么的 我这里就不讲了... 太low了