多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[info] **从表建立关联关系** >belongsTo('关联主表模型名','从表外键名','关联表主表键名',\['模型别名定义'\],'join类型'); >返回belongsTo类对象 | 参数 | 说明 | | --- | --- | | model | 关联的从表模型名,该参数被定义时,与之对应当前模块下必须有个与此参数名相同的模块文件;如果不是前模块而是跨模块,此参数为带有完整的命名空间的模型名 | | foreignKey | 从表外键名,默认为:当前模型名_id | | localKey | 主表的主键名 | | alias | 定义此模型的别名.`5.0.5+`版本开始,模型别名定义参数已经废弃。 | | joinType | join类型,默认`INNER` | ## **定义** 定义一对一关联,例如,一个用户都有一个个人资料, user表(主表) ![](https://img.kancloud.cn/b8/10/b8105f74178cb588590809c2de5ce7e1_251x49.png) profile(从表) ![](https://img.kancloud.cn/04/68/0468a56482248422c8bca17d3980f272_367x43.png) **从建立关联关系例子:** 定义主表对应的`Profile`模型如下: ~~~ namespace app\index\model; use think\Model; class Profile extends Model { public function profileRelationUser() { return $this->blongsTo('User'); //默认情况下, 我们使用的是`user_id`作为外键关联,如果不是的话则需要在关联定义的时候指定 //return $this->blongsTo('Profile','uid'); //`V5.0.3+`版本开始,可以支持为关联模型定义需要查询的字段;如果使用的是`join`方式的关联,不支持指定field字段。 //return $this->blongsTo('Profile')->field('id,name,email'); //跨模块需要完整的命名空间 //return $this->blongsTo('\app\api\Profile'); } } ~~~ ## **关联查找** 在从表的Profile模型的profile方法定义好关联之后,就可以使用下面的方法获取关联数据: ~~~ $profile=\app\index\model\Profile::get(1); echo $profile->profile_relation_user->id; echo $profile->profile_relation_user->username; echo $profile->phone; //或者 $user=\app\index\model\Profile::with('profile_relation_user')->find(1); echo $profile->profile_relation_user->id; echo $profile->profile_relation_user->username; echo $profile->phone; //with()返回的是Query对象 ~~~ >[danger] 有一点需要注意的是,关联方法的命名规范是驼峰法,而关联属性则一般是小写+下划线的方式,系统在获取的时候会自动转换对应,读取`user_profile`关联属性则对应的关联方法应该是`userProfile`。 如果要根据关联表的查询条件查询当前模型的数据,可以使用`hasWhere`方法,例如: ~~~ $user = \app\index\model\User::hasWhere('user_relation_profile',['phone'=>'0086-010-66778899'])->find(); echo $user->username; ~~~ ## **关联新增** 参考主表一对一