ThinkPHP5.1中“授权模型关联”指通过belongsToMany实现用户、角色、权限的多对多关系建模,依赖中间表(如access、role_permission)及可选Pivot模型扩展,支持attach/detach等授权操作。

ThinkPHP5.1中“授权模型关联”并不是一个内置术语,实际指的是通过模型关联实现权限控制逻辑,常见于用户(User)与角色(Role)、权限(Permission)或多对多授权关系的建模。核心是使用 belongsToMany 定义用户与角色/权限之间的多对多关联,并配合中间表(如 access、role_user、user_permission)完成授权数据管理。
定义用户与角色的多对多关联
在 app\model\User.php 中添加:
public function roles()
{
return $this->belongsToMany('Role', 'access', 'user_id', 'role_id');
}
说明:
- 'Role':关联的角色模型类名(需存在 app\model\Role.php)
- 'access':中间表名(不带表前缀,如实际表为 tp_access,这里只写 access)
- 'user_id':中间表中指向用户的外键
- 'role_id':中间表中指向角色的外键
定义角色与权限的关联(可选进阶)
若需细粒度控制(如角色拥有哪些权限),可在 app\model\Role.php 中添加:
立即学习“PHP免费学习笔记(深入)”;
public function permissions()
{
return $this->belongsToMany('Permission', 'role_permission', 'role_id', 'permission_id');
}
对应中间表 role_permission 需包含 role_id 和 permission_id 字段。
中间表模型(推荐,便于扩展逻辑)
为中间表(如 access)单独建模型,继承 think\model\Pivot:
namespace app\model;
use think\model\Pivot;
class Access extends Pivot
{
// 可开启自动时间戳
protected $autoWriteTimestamp = true;
// 可定义只读字段或自动处理逻辑
}
然后在 User 模型中引用该模型:
return $this->belongsToMany('Role', Access::class, 'user_id', 'role_id');
授权操作常用方法
获取用户所有角色:
$user = User::get(1); $roles = $user->roles;
给用户分配角色(新增中间表记录):
-
附加单个角色 ID:
$user->roles()->attach(2); -
附加角色模型:
$user->roles()->attach(Role::get(3)); -
批量附加并写入额外字段:
$user->roles()->attach([1,4], ['created_at' => date('Y-m-d H:i:s')]); -
移除角色:
$user->roles()->detach([1,2]);
注意:这些操作只影响中间表,不新增 Role 表数据;若需同时创建角色再授权,用 save() 或 saveAll()。



















