通过 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 关系?