利用引用生成树状的菜单

在开始之前,先来了解一下什么是地址引用。

 

 php的引用,就是在变量、函数、对象等前面加上&符号,意思是使用不同的变量访问同一个变量内容。

下图来帮助大家理解下引用的作用

接下来进入正题

首先,创建数据

CREATE TABLE `menus` (
	`menu_id` INT(11) NOT NULL AUTO_INCREMENT,
	`title` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
	`parent_id` INT(11) NOT NULL DEFAULT '0',
	PRIMARY KEY (`menu_id`) USING BTREE
)
COMMENT='菜单'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=23
;

INSERT INTO `menus` (`menu_id`, `title`, `parent_id`) VALUES
	(1, '编程语言', 0),
	(2, '数据库', 0),
	(3, '前端', 1),
	(4, '后端', 1),
	(5, 'sql', 2),
	(6, 'nosql', 2),
	(7, 'js', 3),
	(8, 'css', 3),
	(9, 'html', 3),
	(10, 'vue', 3),
	(11, 'java', 4),
	(12, 'c++', 4),
	(13, 'php', 4),
	(14, 'go', 4),
	(15, 'mysql', 5),
	(16, 'oracle', 5),
	(17, 'sqlite', 5),
	(18, 'sqlserver', 5),
	(19, 'redis', 6),
	(20, 'mongodb', 6),
	(21, 'elasticsearch', 6);

其次,处理成树状结构的菜单

第一步,获取全部菜单

 # 全部数据
$menuList = \Database\MenuModel::query()->get()->toArray();

第二步,新建一个$tree,用来存储$menuList的每行数据的引用

$tree = [];
foreach ($menuList as $key => $value) {
    $tree[$value['menu_id']] = &$menuList[$key];
}

第三步,遍历$menuList,将每行数据放置到对应的父级菜单下

foreach ($menuList as $key => $value) {
    $parent = &$tree[$value['parent_id']];
    $parent['children'][] = &$menuList[$key];
}

到此为止,$menuList 里面的每行数据,都包含了其下面所有的子菜单

 第四步,获取指定级别的菜单

$parentId = 0;
$return = [];
foreach ($menuList as $key => $value) {
    if($value['parent_id'] == $parentId) {
        array_push($return, $value);
    }
}

$parentId = 0 表示获取顶级菜单及其树状的子菜单

最终结果如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring JPA中生成树菜单可以通过以下步骤进行实现: 1. 首先,需要在数据库中创建一个用于存储菜单信息的表,表结构至少需要包含id、菜单名、父菜单id等字段。可以使用`@Entity`注解来定义这个菜单实体类,并使用`@Table`注解来指定对应的数据库表。 2. 在实体类中,可以使用`@ManyToOne`注解定义菜单与父菜单的关联关系,表示该菜单对应的父菜单。这样就能够通过父菜单id查询到对应的父菜单信息。 3. 在菜单实体类中,可以添加一个名为`children`的字段,该字段用来存储该菜单的子菜单信息。使用`@OneToMany`注解定义菜单与子菜单的关联关系,并通过`mappedBy`属性指定关联关系的字段。 4. 创建一个自定义的Repository接口,继承`JpaRepository`接口,并自定义一个查询方法,用于根据父菜单id查询子菜单列表。在自定义方法上使用`@Query`注解,并编写JPQL查询语句,通过`@Query`注解中的`nativeQuery`属性指定是否使用原生的SQL查询。 5. 在Controller中,注入自定义的Repository接口,并通过调用自定义方法查询到根节点的菜单列表。 6. 通过递归的方式将查询到的根节点菜单信息组装成树形结构,可以使用一个递归方法来实现这个过程。该方法接收一个菜单列表作为参数,先遍历菜单列表,找到根节点菜单,然后递归调用该方法,将该根节点菜单的子菜单列表作为参数传入。 7. 在前端展示时,可以通过遍历树形结构,依次展示菜单的层级关系和子菜单。 通过以上步骤,就可以在Spring JPA中生成树菜单了。注意,树形结构的生成主要是通过数据库的表结构和实体类的关联关系来实现的,而查询和组装树形结构的逻辑需要在后端进行处理,然后将生成的树形菜单传给前端进行展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值