thinkphp6三表权限控制代码(动态菜单)
3张表:用户-角色-菜单
create table TbUser(
Id int primary key identity(1,1),
Username varchar(50) not null,
Password varchar(100) not null,
Status tinyint not null default 1,
CreateTime datetime not null,
UpdateTime datetime not null
)
insert dbo.TbUser
(
Username,
Password,
Status,
CreateTime,
UpdateTime
)
VALUES
( '用户1', -- Username - varchar(50)
'123456', -- Password - varchar(100)
DEFAULT, -- Status - tinyint
GETDATE(), -- CreateTime - datetime
GETDATE() -- UpdateTime - datetime
)
create table TbRole(
Id int primary key identity(1,1),
RoleName varchar(50) not null,
UserId varchar(50) not null,
Status tinyint not null default 1,
CreateTime datetime not null,
UpdateTime datetime not null
)
insert dbo.TbRole
(
RoleName,
UserId,
Status,
CreateTime,
UpdateTime
)
VALUES
( '超级管理员', -- RoleName - varchar(50)
'1',
DEFAULT, -- Status - tinyint
GETDATE(), -- CreateTime - datetime
GETDATE() -- UpdateTime - datetime
)
create table TbMenu(
Id int primary key identity(1,1),
MenuName varchar(50) not null,
MenuPath varchar(1000) not null,
MenuLevel tinyint not null,
RoleId varchar(10) not null,
Pid varchar(10),
status tinyint not null default 1,
createTime datetime not null,
updateTime datetime not null
)
insert dbo.TbMenu
(
MenuName,
MenuPath,
MenuLevel,
RoleId,
Pid,
status,
createTime,
updateTime
)
VALUES
( '一级菜单01', -- MenuName - varchar(50)
'http://www.baidu.com', -- MenuPath - varchar(1000)
'1',
'1',
NULL, -- Pid - varchar(10)
DEFAULT, -- status - tinyint
GETDATE(), -- createTime - datetime
GETDATE() -- updateTime - datetime
)
insert dbo.TbMenu
(
MenuName,
MenuPath,
MenuLevel,
RoleId,
Pid,
status,
createTime,
updateTime
)
VALUES
( '一级菜单02', -- MenuName - varchar(50)
'http://www.qq.com', -- MenuPath - varchar(1000)
'1',
'1',
NULL, -- Pid - varchar(10)
DEFAULT, -- status - tinyint
GETDATE(), -- createTime - datetime
GETDATE() -- updateTime - datetime
)
insert dbo.TbMenu
(
MenuName,
MenuPath,
MenuLevel,
RoleId,
Pid,
status,
createTime,
updateTime
)
VALUES
( '一级菜单03', -- MenuName - varchar(50)
'http://www.163.com', -- MenuPath - varchar(1000)
'1',
'1',
NULL,
DEFAULT, -- status - tinyint
GETDATE(), -- createTime - datetime
GETDATE() -- updateTime - datetime
)
insert dbo.TbMenu
(
MenuName,
MenuPath,
MenuLevel,
mRoleId,
Pid,
status,
createTime,
updateTime
)
VALUES
( '二级菜单01', -- MenuName - varchar(50)
'201', -- MenuPath - varchar(1000)
'2',
'1',
'1',
DEFAULT, -- status - tinyint
GETDATE(), -- createTime - datetime
GETDATE() -- updateTime - datetime
)
insert dbo.TbMenu
(
MenuName,
MenuPath,
MenuLevel,
RoleId,
Pid,
status,
createTime,
updateTime
)
VALUES
( '二级菜单02', -- MenuName - varchar(50)
'202', -- MenuPath - varchar(1000)
'2',
'1',
'1',
DEFAULT,
GETDATE(),
GETDATE()
)
insert dbo.TbMenu
(
MenuName,
MenuPath,
MenuLevel,
RoleId,
Pid,
status,
createTime,
updateTime
)
VALUES
( '二级菜单03', -- MenuName - varchar(50)
'203', -- MenuPath - varchar(1000)
'2', -- Pid - varchar(10)
'1',
'1',
DEFAULT, -- status - tinyint
GETDATE(), -- createTime - datetime
GETDATE() -- updateTime - datetime
)
select * from dbo.TbUser
select * from dbo.TbRole
select * from dbo.TbMenu

模型
用户模型
class TbUser extends Model
{
//
protected $table = 'TbUser';
public function role(){
return $this->hasOne(TbRole::class,'UserId','Id');
}
//远程一对多
public function menu(){
return $this->hasManyThrough(TbMenu::class,TbRole::class,'UserId','RoleId','Id','Id');
}
}
角色模型
class TbRole extends Model
{
//
protected $table = 'TbRole';
public function menu(){
return $this->hasMany(Menu::class,'RoleId','Id');
}
}
菜单模型
class TbMenu extends Model
{
//
protected $table = 'TbMenu';
}
public function test(){
$user = TbUser::find(1);
$result = $user->menu->toarray();
$menu = [];
foreach($result as $val){
// dump($val);
if($val["MenuLevel"] == 1){
$item = [];
foreach ($result as $val2){
if($val2["MenuLevel"] == 2 && $val2["Pid"] == $val["Id"]){
$item2 = [];
$item2["id"] = $val2["Id"];
$item2["menuName"] = $val2["MenuName"];
$item2["menuPath"] = $val2["MenuPath"];
array_push($item,$item2);
}
}
$menu[$val["MenuName"]] = $item;
}
}
return json($menu);
}

通过用户查询角色(这个是通过用户直接查询出role角色)
public function test2(){
$user = TbUser::find(1);
$result = $user->role->toarray();
return json($result);
}

需要把用户和角色都查询出来需要用到with
public function test3(){
$result = TbUser::with('role')->select();
return json($result);
}


浙公网安备 33010602011771号