方案片段:单员工多无限极部门输出方案
简介
单员工归属于多部门,数据库设计及实际使用。
输出: 部门 1 - 部门 2 - 部门 4 - 小组, 部门 5 - 临时项目组
categories
字段名称 | 描述 | 类型 | 加索引缘由 |
---|---|---|---|
id | 自增长 ID | unsigned int | 主键 |
name | 部门名称 | varchar | 无 |
parent_id | 父级 ID | unsigned int, null | 外键 |
is_directory | 是否拥有子级 | tinyint | 无 |
level | 当前层级 | unsigned int | 无 |
path | 该子级所有父级 ID | varchar | 无 |
user_subordinate
字段名称 | 描述 | 类型 | 加索引缘由 |
---|---|---|---|
id | 自增长 ID | unsigned int | 主键 |
user_id | 用户 ID | unsigned int, null | 外键 |
categories_id | 部门 ID | unsigned int, null | 外键 |
使用案例
// 伪代码
// categories.path 示例 ‘-1-3-5-’
// 使用用户ID查询用户数据
user = Db::query("select * from user where id = ?", id);
// 查询该用户所属的所有部门ID
userCategorieids = Db::query("select categories_id from user_subordinate where id = ?", user.id);
if (!userCategorieids) return [];
// 查询该用户所属所有部门数据
userCategorieids = implode(',' , array_values(userCategorieids));
userCategoriepaths = Db::query("select id,path from categories where id in (?)", userCategorieids);
if (!userCategoriepaths) return [];
if (!is_array(userCategoriepaths)) userCategoriepaths= [userCategoriepaths]
// 循环查询所有部门的父系部门数据
userCategories = [];
foreach(userCategoriepaths as userCategoriepath) {
// 将 categoreie.path 从 '-1-3-5-'转换为'1,3,5',并拼接上 categoreie.id,得到 '1,3,5,7' 后,从 categoreies 查询并以 level 排序,用categoreie.name 拼接。
pathIds = implode(',', array_filter(explode('-', trim(userCategoriepath.path, '-')))) . ',' . userCategoriepath.id;
pathCategorieNames = implode('-', array_values(Db::query("select name from categories where id in (?) order by level", pathIds)));
array_push(userCategories, pathCategorieNames);
}
return userCategories
本文链接:https://www.masterzc.cn/archives/123.html
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处