多对多关系

时间:2015-07-02 15:09:49

标签: laravel many-to-many eloquent

我有四张桌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 :(得分: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);进行访问。这可能不是最好的解决方案,但它应该可以解决问题。

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

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;一样访问它。我相信这会像你期望的那样奏效。