首页 文章

多对多关系

提问于
浏览
0

我有四张 table Users[user_id] - role_user[user_id,role_id] - Roles[role_id] - Permissions[role_id] . 用户可以有许多角色,而角色有很多权限 . 因此,Permission具有一个角色,而角色属于许多用户 .

// User.php ...
class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany('Role');
    }
}

// Roles.php
class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany('App\User');
    }

    public function permissions()
    {
        return $this->hasMany('Permission');
    }

}

// Permission.php

class Permission extends Model
{
    public function role()
    {
        return $this->belongsTo('Role');
    }
}

我想真正的问题是;你可以链接关系方法,如:App \ User :: find(1) - > roles-> permissions;我不认为你可以,因为 ->roles 返回一个 Collection 而不是一个雄辩的模型,所以权限方法不存在 roles .

有没有其他方法可以获得给定用途的所有角色的权限集合,最好是一行?

1 回答

  • 0

    我还没有对它进行过测试,但我认为这样可以使用非常小的twick . 在用户模型中添加此功能 .
    public function getPermission($ id){

    $ roles = Roles :: where('user_id','=',id) - > get();

    $ permissions = array();

    foreach($ roles as $ role){

    array_push($ permissions,$ role-> permissions);

    }

    return $ permissions;

    }
    并以$ user-> getPermission($ user-> id);进行访问 . 这可能不是最好的解决方案,但它应该解决问题 .

    UPDATED CODE
    您可以像下面的示例一样使用访问器,这将返回权限集合 . 在用户模型中使用此功能

    public function getPermissions($value){
    
            $role_ids = Roles::where('user_id','=', $value)
                ->select(array('permission_id'))
                ->toArray();
    
            return Permission::find($role_ids);
    
        }
    

    并像 $permissions = App\User::find(1)->permissions; 一样访问它 . 我相信这会像你期望的那样奏效 .

相关问题