我的应用程序有2个主要模块是Foo
和Bar
。它也有3种作用类型:admin
,manager
&staff
.
每个用户被分配给一个主管,这样每个主管将有一些下属分配给他/她。
例如,staff1由manager1监督,manager1也由admin1监督。
此关系的当前实践在两个模块中都实现了。因此,每个主管都对下属的Foo
和Bar
负责。
User.php
<?php
namespace App;
use SpatiePermissionTraitsHasRoles;
use IlluminateSupportStr;
class User {
protected $fillable = ['name','email','password','supervisor_id'];
protected $appends = ['role'];
public function getRoleAttribute(){
return $this->roles[0];
}
public function getNameAttribute($value){
return Str::title($value);
}
public function parent(){
return $this->hasOne('AppUserStructure', 'user_id');
}
public function scopeSupervisor($query){
return $query->where('id', $this->supervisor_id)->first();
}
public function foo(){
return $this->hasMany(Foo::class, 'user_id', 'id');
}
public function bar(){
return $this->hasMany(Bar::class, 'user_id', 'id');
}
}
UserStructure.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class UserStructure extends Model{
protected $fillable = ['user_id', 'parent_id'];
public function user(){
return $this->belongsTo('AppUser', 'user_id');
}
}
Role.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Role extends Model{
protected $fillable = ['name'];
public function roles(){
return $this->belongsTo('AppUser', 'role');
}
}
RoleAndPermission.php
<?php
use IlluminateDatabaseSeeder;
use SpatiePermissionModelsRole;
use SpatiePermissionModelsPermission;
class RolesAndPermissionsSeeder extends Seeder{
public function run(){
$roles = ['admin','manager','staff'];
app()[SpatiePermissionPermissionRegistrar::class]->forgetCachedPermissions();
foreach ($roles as $role) {
Role::updateOrCreate(['name' => $role]);
}
}
}
UserSeeder.php
<?php
use IlluminateDatabaseSeeder;
use AppUser;
use AppUserStructure;
class UserSeeder extends Seeder{
public function run(){
$items = [
['role'=> 'admin',
'name'=> 'admin',
'email'=> 'admin@myapp.com',
'password'=> 'password',
'supervisor_id'=> 1],
['role'=> 'manager',
'name'=> 'manager',
'email'=> 'manager@myapp.com',
'password'=> 'password',
'supervisor_id'=> 1],
['role'=> 'staff',
'name'=> 'staff',
'email'=> 'staff@myapp.com',
'password'=> 'password',
'supervisor_id'=> 2],
];
foreach($items as $data) {
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'supervisor_id' => $data['supervisor_id'],
]);
$user->assignRole($data['role']);
}
$userStructure = [
['parent_id'=> 0, 'user_id'=> 1],
['parent_id'=> 1, 'user_id'=> 2],
['parent_id'=> 2, 'user_id'=> 3]
];
UserStructure::insert($userStructure);
}
}
我的问题是,我如何相应地修改这种关系,以便任何主管[admin
/manager
]将只分配给一个模块的下属[manager
/staff
] ?
(例句:Foo
模块中staff1由manager1监督.在Bar
模块中,他将由manager2指导。
据我所知,您可以在角色中添加一列建模(如类型),然后用条件
将角色分配给用户