使用 `laravel-nestedset` 实现动态权限路由

news2024/11/18 4:24:51

laravel-nestedset 是一款基于嵌套集合模型(Nested Set Model)的用于实现有序树的 laravel 扩展包。

什么是嵌套集合模型?

嵌套集合或嵌套集合模型是一种在关系数据库表中高效存储分层数据的方法,理论基础为预排序遍历树算法(MPTT,Modified Preorder Tree Taversal)。

嵌套集合模型是根据树遍历对树中的每个节点进行数字编号,遍历会访问每个节点两次,按访问顺序分配数字编号,并在两次访问中都分配。这将为每个节点留下两个数字编号,它们作为节点的两个字段存储。这使得查询变得高效——可以通过比较这些数字编号来获得层级结构关系。但是更新数据将需要给节点重新分配数字,因此变得低效。尽管很复杂但是可以通过不使用整数而是使用有理数来提升写操作的效率。读高效,写低效

嵌套集合模型

其常用的应用场景为实现无限级分类。

使用laravel-nestedset

使用 laravel-nestedset 不仅可以实现无限级分类,同样可以实现动态权限路由。

比如这里我们要实现根据权限获取系统整个菜单树中的局部菜单树(也可以是整个菜单树,这个根据权限过滤后的结果):

	// 前置逻辑已经获取到根据权限筛选出的菜单路由id(menusIds)
	// 使用linkNodes方法可以为数据集合中的每个节点重新填充父子关系,即生成树结构
   $menus = Menu::whereIn('id', $menuIds)
   				->orWhereIn('parent_id', $menuIds)
   				->get()
   				->linkNodes();
   // 过滤其中的非root节点
   $user->menus = $menus->filter(function($item){
       return $item->isRoot();
   });

linkNodes方法为数据集合中的每个节点重新填充父子关系,其源码如下:

<?php

namespace Kalnoy\Nestedset;

use Illuminate\Database\Eloquent\Collection as BaseCollection;
use Illuminate\Database\Eloquent\Model;

class Collection extends BaseCollection
{
    /**
     * Fill `parent` and `children` relationships for every node in the collection.
     *
     * This will overwrite any previously set relations.
     *
     * @return $this
     */
    public function linkNodes()
    {
        if ($this->isEmpty()) return $this;

        $groupedNodes = $this->groupBy($this->first()->getParentIdName());

        /** @var NodeTrait|Model $node */
        foreach ($this->items as $node) {
            if ( ! $node->getParentId()) {
                $node->setRelation('parent', null);
            }

            $children = $groupedNodes->get($node->getKey(), [ ]);

            /** @var Model|NodeTrait $child */
            foreach ($children as $child) {
                $child->setRelation('parent', $node);
            }

            $node->setRelation('children', BaseCollection::make($children));
        }

        return $this;
    }

Ref:
Tree by Nodes #292
左右值无限级分类算法(预排序遍历树算法)
嵌套集合模型(Nested set model)介绍
kalnoy/nestedset

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源SCRM营销平台-MarketGo产品介绍(一)

1、MarketGo概述 MarketGo中国式营销自动化开源项目标杆。 MarketGo更像是一个 SDK 、引擎&#xff0c;通过提供的标准化功能和基础能力&#xff0c;让开发者能快速搭建一个营销自动化系统&#xff0c;快速完成从0-1的过程&#xff0c;并且能基于开放的能力和源码&#xff0c…

【Unity3D】使用GL绘制线段

1 前言 线段渲染器LineRenderer、拖尾TrailRenderer、绘制物体表面三角形网格从不同角度介绍了绘制线段的方法&#xff0c;本文再介绍一种新的绘制线段的方法&#xff1a;使用 GL 绘制线段。 Graphics Library&#xff08;简称 GL&#xff09;&#xff0c;包含一系列类似 OpenG…

python tk 小案例:制作一个问题搜索器

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 在逛百度搜东西的时候&#xff0c;有一些杂乱的词条容易混入进来‘ 那么&#xff1f;我们能不能自己创建一个类似百度的搜索器呢&#xff1f; 当然是可以的&#xff0c;今天博主就来分享一下如何…

Dell电脑搭配Win10休眠 = 黑屏

应该是Dell的硬件和win10操作系统的适配性不行。 Dell黑屏现象 刚买Dell笔记本的时候&#xff0c;就有“黑屏”问题。刚买的一个周、一个月、一年、两年都有这样的问题&#xff0c;而且一个月至少发生一次&#xff1a; 摁了开机键&#xff0c;也开机成功了&#xff0c;电脑就…

Python——旋转字符串

题目描述 给定两个字符串s和goal&#xff0c;如果在若干次旋转操作后s能够变成goal&#xff0c;那么就返回True s的旋转操作就是把s最左面的字符放到最右面 例如&#xff1a; s ‘abcde’ 旋转一次就是‘bceda’ 而如果goal是bceda&#xff0c;那么goal就是s的旋转字符串 P…

[附源码]JAVA毕业设计心理学网站(系统+LW)

[附源码]JAVA毕业设计心理学网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#…

MySQL数据库的索引以及事务详解

课前导读&#xff1a; 本章设计到MySQL数据库的索引和事务操作&#xff0c;索引操作设计的概念内容比较多&#xff0c;但是他涉及到数据库的内部运行效率和使用空间等多方面知识&#xff0c;相比比较重要&#xff0c;也需要进行相关学习。而事务操作更不用多说&#xff0c;是我…

WEB进销存管理系统源码带操作手册和源码安装说明文档

适用于大众化普通商品&#xff0c;包括鞋服、眼镜店等&#xff0c;前端使用js、html、css最基本的技术&#xff0c;后端使用sql、存储过程&#xff0c;前后端才有json交互&#xff0c;不依赖于任何第三方框架&#xff0c;简单易用易学&#xff0c;适合扩展。 源码类型&#…

Java十年功力还是涨不了薪,推荐必看《Java核心技术及面试指南》

很多程序员工作努力&#xff0c;但表现一般&#xff0c;导致面试失败或者涨不了薪资&#xff0c;在我看来&#xff0c;这种情况出现的原因有两个&#xff1a;一个是“盲人摸象&#xff0c;只知其一不知其二”&#xff0c;埋头做技术或者“CV工程师”&#xff0c;再做几年也没成…

JavaScript期末大作业 基于HTML+CSS+JavaScript技术制作web前端开发个人博客(48页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(四)高侧非隔离栅极驱动

高侧非隔离栅极驱动 1.适用于P沟道的高侧驱动器 2.适用于N沟道的高侧直接驱动器 1.适用于P沟道的高侧驱动器 高侧非隔离栅极驱动可按照所驱动的器件类型或涉及的驱动电路类型来分类。相应地&#xff0c;无论是使用P沟道还是 N沟道器件&#xff0c;是实施直接驱动、电平位移驱…

项目设置统一返回结果对象

一、统一返回数据格式 项目中我们会将响应封装成json返回&#xff0c;一般我们会将所有接口的数据格式统一&#xff0c; 使前端(iOS,Android, Web)对数据的操作更一致、轻松。 一般情况下&#xff0c;统一返回数据格式没有固定的格式&#xff0c;只要能描述清楚返回的数据状态以…

十四、使用 Vue Router 开发单页应用(4)

本周概要 导航守卫 全局守卫路由独享的守卫组件内守卫导航解析流程 14.10 导航守卫 在 14.4 嵌套路由 小节中已经使用过一个组件内的导航守卫&#xff1a;beforeRouteUpdate 。Vue Router 提供的导航守卫主要用于在导航过程中重定向或取消路由&#xff0c;或添加权限验证、…

python基于用户画像和协同过滤实现电影推荐系统

1、概要 传统电影推荐系统大多使用协同过滤算法实现电影推荐&#xff0c;主要实现机理是通过用户评分及用户观影历史数据抽象为多维向量利用欧式距离或其他向量计算公式实现推荐&#xff0c;本文中将采用常用的机器学习算法Kmeans聚类算法协同过滤算法word2vec搜索推荐模型多模…

【猿如意】MySQL的下载、安装、使用,这一文足够了~

大家好&#xff0c;我是笑小枫&#xff0c;本篇文章为大家分享一个好用的工具-【猿如意】 对于这个工具呢&#xff0c;怎么说呢&#xff1f;简单点就是&#xff1a;不经意间回首&#xff0c;放眼望去&#xff0c;满眼是你~ 下面就已Mysql下载安装的过程来和大家一起体验下我们的…

【代码审计-.NET】基于.NET框架开发的代码审计

目录 一、审计方法 1、从黑盒到白盒 2、白盒审计 3、灰盒审计 二、审计过程 1、功能点追踪 2、功能函数 3、目录扫描 4、getshell 5、安全模块未引用 6、自动扫描工具 一、审计方法 1、从黑盒到白盒 --->从一个网站前端 --->查看其页面的源代码&#xff0c;并分…

【日常系列】LeetCode《20·数据结构设计》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 155 【剑指 30】【top100】&#xff1a;最小栈 https://leetcode.cn/problems/min-stack/ 提示&#xff1a; -2^31 < val < 2^31 - 1 pop、top 和…

快看梅西射门了,这是梅西的大力抽射~阿根廷加油,我们是冠军

&#x1f5b1; ⌨个人主页&#xff1a;Love And Program的个人主页 &#x1f496;&#x1f496;如果对你有帮助的话希望三连&#x1f4a8;&#x1f4a8;支持一下博主 来自梅西的大力抽射&#x1f970;致昨晚的梅西思路加入阿根廷元素加入足球元素源码致昨晚的梅西 昨晚上阿根廷…

springcloud 从头开始构建分布式微服务脚手架

必备服务&#xff08;Windows开发本机环境&#xff09; Java maven mysql&#xff1a;自启动服务&#xff0c;后台运行 127.0.0.1:3306 MySQL57 root/root Redis&#xff1a;手动运行&#xff0c;前台运行 127.0.0.1:6379 执行命令redis-server.exe redis.windows.conf na…

Weblogic漏洞 - 通杀方式

文章目录简介恶意文件把恶意文件部署到攻击机&#xff0c;并开启http服务写入文件写入反弹shell命令执行反弹shell命令拿到目标机器权限[linux] WebLogic Server 版本: 12.2.1.3简介 最早在 CVE-2019-2725 被提出&#xff0c;对于所有Weblogic版本均有效。 构造一个XML文件&…