一对多不在Laravel Eloquent工作

时间:2016-04-02 06:14:16

标签: laravel laravel-5 laravel-5.1

我有三个相关的模型。首先,我拥有属于角色的用户。另一方面,角色有很多角色。角色属于许多权限,权限属于许多角色。我按照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();
    });

1 个答案:

答案 0 :(得分:1)

在第return !! $role->intersect($this->role)->count();行中,显示$this->role的部分可能未返回集合,这就是您收到此错误的原因。在Collection.php中,有一个方法可以迭代通过交集方法发送的集合中的所有项目,该方法获取它的主键。因为您没有向intersect()方法发送集合,所以它尝试在布尔值中使用方法getKey()。尝试:

return !! $role->intersect($this->role->get())->count();