Получить общее разрешение от пользователей и ролей, принадлежащих ToMany - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть 3 модели:

  • Пользователь
  • Роль
  • Разрешение

Примечание:

  • у пользователя могут быть прямые разрешения
  • у роли могут быть права
  • у пользователя могут быть роли

Я пытаюсь получить общее количество разрешений пользователяимеет, либо через свои прямые разрешения или через свои роли ролей.Поэтому мне нужно объединить оба в одну коллекцию и подсчитать общее количество.

Я установил отношения ownToMany для User и Role:

public function permissions()
{
    return $this->belongsToMany('App\Permission');
}

Как мне сделатьэто?

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вам необходимо использовать hasManyThrough отношение

Вот ссылка на документацию: Красноречивая документация

, чтобы вы могли сделать что-то вроде этого:

public function permissions()
{   
    $directPermissions = $this->belongsToMany('App\Permission'); 
    $rolePermissions = $this->hasManyThrough('App\Permissions', 'App\Role');
    return $directPermissions->merge($rolePermissions);
}
0 голосов
/ 24 ноября 2018

Я не уверен, но это поможет открыть ваш user model

public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

public function hasRole(...$roles)
    {

        foreach($roles as $role)
        {
            if($this->roles->contains('name',$role))
            {
                return true;
            }
        }
        return false;
    }

   public function hasPermission($permission)
    {
        return $this->hasPermissionThroughRole($permission) || (bool) $this->permissions->where('name',$permission->name)->count();
    }

    public function hasPermissionThroughRole($permission)
    {
        foreach($permission->roles as $role)
        {
            if($this->roles->contains($role))
            {
                return true;
            }
        }
        return false;
    }

Затем откройте Role Model и добавьте эти

public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

public function users()
    {
        return $this->belongsToMany(User::class);
    }

и откройте permission model

public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

public function users()
    {
        return $this->belongsToMany(User::class);
    }

и, наконец, для загрузки всех прав доступа к ролям и пользователю выполните команду php artisan make:provider PermissionServiceProvider

открыть созданного вами поставщика услуг и

добавить

use App\Permission;
use Illuminate\Support\Facades\Gate;

добавьте код по методу boot

Permission::get()->map(function ($permission) 
            {
                Gate::define($permission->name, function ($user) use ($permission) 
                {
                    return $user->hasPermission($permission);
                });
            });

надеюсь, это поможет, если вы обнаружите какие-либо трудности, пожалуйста, прокомментируйте ниже

0 голосов
/ 24 ноября 2018

Я понял это через flatMap .

...