【问题标题】:Laravel Menus with childs and permissions via eloquent通过 eloquent 具有子项和权限的 Laravel 菜单
【发布时间】: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);
    }


}

【问题讨论】:

    标签: laravel eloquent relationship eloquent-relationship


    【解决方案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() 函数,我想建立关系或使用自定义查询来获取权限...
    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多