当前位置: 首页 > 后端技术 > PHP

2022-8-29TP6模型多对多

时间:2023-03-30 02:20:53 PHP

1.用户角色用户和角色之间是多对多的关系:一个用户可以有多个角色;一个角色可以分配给多个角色。2、前期准备(一)路由//查看用户角色Route::get('userroles/:id','UserAccess/read');//给用户分配角色Route::post('userroles','UserAccess/save');//删除用户的角色Route::post('userrole/delete','UserAccess/delete');(2)控制器使用命令phpthinkmake:controllerUserAccess(3)表1.用户表创建用户表SQL语句:CREATETABLE`think_users`(`id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'usernumber',`name`varchar(255)NOTNULL,`created_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`updated_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=MyISAMAUTO_INCREMENT=3DEFAULT字符集=utf8mb4;用户表如下:2.角色表创建角色表的SQL语句:CREATETABLE`think_role`(`id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'number',`name`varchar(255)DEFAULTNULLCOMMENT'rolename',`remark`varchar(255)DEFAULTNULLCOMMENT'remark',`del_flag`tinyint(4)DEFAULT'0'COMMENT'0表示正常,-1表示删除',`created_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`updated_at`时间戳不是NULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=MyISAMAUTO_INCREMENT=6DEFAULTCHARSET=utf8mb4;角色表如下:3.用户角色表(中间表)创建用户角色表的SQL语句:CREATETABLE`think_user_role`(`id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'number',`user_id`int(11)NOTNULLCOMMENT'userID',`role_id`int(11)NOTNULLCOMMENT'roleID',`create_by`varchar(255)DEFAULTNULLCOMMENT'createdby',`created_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`updated_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=INCRISCHARSET=utf8mb4;用户角色表如下:(4)模型1.用户模型使用命令:phpthinkmake:modelUser在用户模型中定义角色方法:belongsToMany(Role::class,'think_user_role','role_id','user_id');}}2。角色模型phpthinkmake:modelRole在角色模型方法中定义用户:belongsToMany(User::class,'think_user_role','user_id','role_id');}}3。用户角色模型phpthinkmake:model访问用户角色模型:param();}$user_id=$params['user_id'];$role_id=$params['role_id'];$user=User::find($user_id);$roles=$user->roles;$role_ids=$this->collectionColumn($roles,'role_id');if($this->isAssignRole($role_id,$role_ids)){return$this->setJsonResult('error',40000,'角色已分配,无需再次分配');}if(isset($params['create_by'])&&!empty($params['create_by'])){//传递给中间表的附加属性$user->roles()->attach($role_id,['create_by'=>$params['create_by']]);}else{$user->roles()->attach($role_id);}返回$this->setJsonResult('成功',10000,'用户授权成功',['user_id'=>$user_id,'role_id'=>$role_id]);}/***显示用户的角色**@paramint$id*@return\think\Response*/publicfunctionread($id){$user=User::find($id);$roles=$user->roles;//转储($角色);$role_name=[];foreach($rolesas$role){$role_name[]=$role->name;}return$this->setJsonResult('成功',10000,'操作成功',$role_name);}/***删除用户的角色**@paramint$id*@return\think\Response*/publicfunctiondelete(Request$request){$params=$request->param();$user_id=$params['user_id'];$user=User::find($user_id);$role_id=$params['role_id'];$user->roles()->detach($role_id);return$this->setJsonResult('成功',10000,'删除用户权限成功');}公共函数setJsonResult($status,$code,$message='',$data=[]){returnjson(['status'=>$status,'code'=>$code,'message'=>$message,'data'=>$data]);}/***获取数据收集某个字段的值**@paramobject$collection,string$column*@returnarray*/publicfunctioncollectionColumn($collection,$column){$re=[];foreach($collectionas$val){$re[]=$val->pivot->$column;}返回$re;}/***判断role_id对应的角色之前是否已经分配给用户**@paramstring$collection,array$role_ids*@returnbool*/publicfunctionisAssignRole($role_id,$role_ids){if(in_array($role_id,$role_ids)){返回真;}返回假;}}4.测试前面测试id为1的用户角色分配好了,现在测试2号用户角色的查看、分配和删除:1.查看2号用户的角色,调用接口到查看用户角色:返回值的data属性为空2.给用户分配角色,调用分配给用户角色接口:用户角色表如下:再次调用接口查看用户角色:3.删除用户角色调用删除用户角色接口:删除2号角色后的数据表:

猜你喜欢