首页 > 解决方案 > 通过 eloquent 具有子项和权限的 Laravel 菜单

问题描述

您好,我正在尝试获取菜单及其子项以及分配给角色的权限。我怎样才能通过雄辩的关系来实现这一点。表是角色、菜单、角色菜单。用户只会看到他有权访问的那些菜单。

这是我的代码:

这是我的控制器方式

$menuList = Menu::tree()->with('roleMenus')->where('per_select','=',0);

这是模型

class Menu extends Model
{
    use HasFactory;
    protected $table = "menus";
    protected $fillable = ['title', 'url', 'parent_id', 'sort_order'];

    public function parent()
    {
        return $this->hasOne('App\Models\Menu', 'id', 'parent_id')->orderBy('sort_order');
    }

    public function children()
    {

        return $this->hasMany('App\Models\Menu', 'parent_id', 'id')->orderBy('sort_order');
    }

    public static function tree()
    {
        return static::with(implode('.', array_fill(0, 100, 'children')))->where('parent_id', '=', '0')->orderBy('sort_order', 'asc')->get();
    }

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


}

标签: laraveleloquentrelationshipeloquent-relationship

解决方案


我通常处理角色和权限的方式是使用Spatie Laravel Permissions包。

我所做的是创建一个 menu.blade.php 文件,其中定义了所有路由。但每条路线仅根据用户权限呈现。您可以使用“can”方法来实现这一点。例如:

@if($user->can('articles'))
  <a href="{{ route('articles) }}">Articles</a>
@endif

@if($user->can('settings'))
  <a href="{{ route('settings) }}">Settings</a>
@endif

您可以使用 Auth::guard($yourGuardName)->user() 更改 $user 以获取当前经过身份验证的用户。


推荐阅读