通过 eloquent 具有子项和权限的 Laravel 菜单

Posted

技术标签:

【中文标题】通过 eloquent 具有子项和权限的 Laravel 菜单【英文标题】:Laravel Menus with childs and permissions via eloquent 【发布时间】:2021-05-27 11:44:06 【问题描述】:

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

这是我的代码:

这是我的控制器方式

$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);
    


【问题讨论】:

【参考方案1】:

我通常处理角色和权限的方式是使用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 以获取当前经过身份验证的用户。

【讨论】:

感谢 Jibon Bose 的回答,但我正在根据需要使用定制。如果您能帮助我编写代码,我将不胜感激。 在这种情况下,我想最好的选择是将您从 db 检索到的菜单列表传递给一个自定义组件,该组件对其进行迭代并呈现您的菜单。如果你想这样做的话。否则你可以自己做一些复制上述包的can方法并做类似的实现。 JIbin,如你所见,我的 tree() 函数,我想建立关系或使用自定义查询来获取权限...

以上是关于通过 eloquent 具有子项和权限的 Laravel 菜单的主要内容,如果未能解决你的问题,请参考以下文章

PHP使用组件构建自己的PHP框架使用 Eloquent 模型进行数据库操作

Laravel 4:Eloquent::find() 不起作用

Laravel 混合获取 Eloquent 急切加载嵌套多个模型

Eloquent hasManyThrough a belongsTo 关系?

如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?

通过 Eloquent 搜索具有多行的多个 ID