我有三个相关的模型。首先,我拥有属于角色的用户。另一方面,角色有很多角色。角色属于许多权限,权限属于许多角色。我按照jeffrey laracast的方式使用AuthServiceProvider。但现在问题是,当我想获取用户的所有权限时,我遇到错误,即“在布尔值上调用成员函数getKey()”。有人可以帮我这个。请参阅以下代码。
user.php的
B
Role.php
public function role()
{
return $this->belongsTo('App\Role');
}
public function assignRole($role)
{
return $this->roles()->save(
Role::whereName($role)->firstOrFail()
);
}
public function hasRole($role)
{
if(is_string($role)){
return $this->role->contains('name', $role);
}
return !! $role->intersect($this->role)->count();
}
Permission.php
class Role extends Model
{
public function users()
{
return $this->hasMany('App\User');
}
public function permissions()
{
return $this->belongsToMany('App\Permission');
}
public function givePermissions(Permission $permission)
{
return $this->permissions()->save($permission);
}
}
AuthServiceProvider
class Permission extends Model
{
public function roles()
{
return $this->belongsToMany('App\Role');
}
}
最后,继承了具有role_id
外键的用户表public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
//get all permissions
foreach ($this->getPermissionTo() as $permission ) {
$gate->define($permission->name, function($user) use ($permission){
return $user->hasRole($permission->roles);
});
}
}
public function getPermissionTo()
{
return Permission::with('roles')->get();
}
角色表
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->integer('role_id')->unsigned();
$table->string('id_no')->unique()->index();
$table->string('u_first_name');
$table->string('u_middle_name');
$table->string('u_last_name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
权限表
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('label')->nullable();
$table->timestamps();
});
permission_role表
Schema::create('permissions', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('label')->nullable();
$table->timestamps();
});
答案 0 :(得分:1)
在第return !! $role->intersect($this->role)->count();
行中,显示$this->role
的部分可能未返回集合,这就是您收到此错误的原因。在Collection.php中,有一个方法可以迭代通过交集方法发送的集合中的所有项目,该方法获取它的主键。因为您没有向intersect()
方法发送集合,所以它尝试在布尔值中使用方法getKey()。尝试:
return !! $role->intersect($this->role->get())->count();