今天做数据查询,使用了模型关联,特此进行记录,有相关工作需求和技术需要的,可以参考:
看文档没有看的很清晰,所以亲自操作了一下,并在这里详细记录一下:
1. 首先看官方文档
2. 三张数据表(用户表sys_user,用户角色信息表sys_role,中间关系表sys_user_role),
注意:以下sql语句均为mysql5.7导出表结构
CREATE TABLE `sys_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
`nickname` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称',
`gender` tinyint(1) NULL DEFAULT 1 COMMENT '性别((1:男;2:女))',
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
`mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系方式',
`status` tinyint(1) NULL DEFAULT 1 COMMENT '用户状态((1:正常;0:禁用))',
`email` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户邮箱',
`deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除标识(0:未删除;1:已删除)',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
)
CREATE TABLE `sys_user_role` (
`uid` bigint(20) NOT NULL COMMENT '用户ID',
`rid` bigint(20) NOT NULL COMMENT '角色ID'
)
CREATE TABLE `sys_role` (
`roleid` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '角色名称',
`code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色编码',
`status` tinyint(1) NULL DEFAULT 1 COMMENT '角色状态(1-正常;0-停用)',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标识(0-未删除;1-已删除)',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`roleid`) USING BTREE
)
填充数据,示例值
sys_user
user_role
system_role
3. 模型User, 正常模型类,增加方法 getrole 方法名可随意定义
注释部分是本次文章重点哦
class User extends Model
{
public function getrole()
{
// hasOneThrough 入参,远程一对多和这个一样
// 关联表模型
// 中间表模型
// 中间表与当前模型的关联外键
// 关联表的主键
// 当前模型表的主键
// 中间表与关联模型的外键
return $this->hasOneThrough(Role::class,UserRole::class,'uid','roleid','id','rid');
}
}
4. 模型UserRole,注意中间表一定要继承 Pivot ,不是think\model
class UserRole extends Pivot
{
//
}
5. 模型Role,正常模型类
class Role extends Model
{
//
}
6、index控制器输出
public function index()
{
$user=User::with('getrole')->select()->toArray();
halt($user);
}
7、输出结果