使用postgresql存储菜单menu表,有字段menu_id和数组类型字段parent_menu_ids,表示一个子菜单可以放到0个或多个菜单下,菜单为多级嵌套,用户有子菜单的权限时,要显示完整的菜单树,如何根据用户拥有的子菜单权限列表查询出该用户可见的整个菜单
时间: 2024-09-20 21:12:54 浏览: 42
PostgreSQL_8.2.3.rar_postgresql_windows 8
在PostgreSQL中,为了实现多级嵌套菜单并根据用户权限查询其可见的菜单,你可以创建一个包含菜单ID和父菜单ID数组的`menu`表,并且在查询时使用`jsonb`数据类型和相关的函数。以下是操作步骤:
1. 定义菜单表结构:
```sql
CREATE TABLE menu (
menu_id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_menu_ids JSONB[] NOT NULL,
permission JSONB -- 存储用户的权限信息,如JSON对象 { "user_id": ..., "permissions": [menu_id1, menu_id2, ...] }
);
```
2. 当用户获得新的子菜单权限时,更新`permission`字段。例如,如果用户获得了`menu_id3`的权限:
```sql
UPDATE menu SET permission = permission || '{"user_id": user_id, "permissions": ["menu_id3"]}'::JSONB WHERE menu_id IN (SELECT * FROM permissions WHERE user_id = 'your_user_id');
```
这里假设`permissions`是一个存储了所有用户权限的临时表。
3. 根据用户的权限查询菜单树:
```sql
WITH RECURSIVE menu_tree AS (
SELECT
m.*,
ARRAY[NULL]::JSONB AS ancestors
FROM
menu m
WHERE
permission->>'permissions' @> '{"user_id": '||'your_user_id'||'}'
UNION ALL
SELECT
m.*,
array_append(menu_tree.ancestors, m.menu_id) AS ancestors
FROM
menu m
JOIN menu_tree ON m.parent_menu_ids && menu_tree.ancestors
)
SELECT * FROM menu_tree;
```
这个递归查询会查找所有的直接子菜单,并通过`parent_menu_ids`字段的交集检查,直到找到所有关联到当前用户权限的菜单节点。
阅读全文