方案片段:单员工多无限极部门输出方案

Author Avatar
云璃 2019年09月02日

简介

单员工归属于多部门,数据库设计及实际使用。

输出: 部门 1 - 部门 2 - 部门 4 - 小组, 部门 5 - 临时项目组

categories

字段名称 描述 类型 加索引缘由
id 自增长 IDunsigned int主键
name 部门名称 varchar
parent_id父级 IDunsigned int, null外键
is_directory 是否拥有子级 tinyint
level当前层级 unsigned int
path该子级所有父级 IDvarchar

user_subordinate

字段名称 描述 类型 加索引缘由
id 自增长 IDunsigned int主键
user_id 用户 IDunsigned int, null外键
categories_id 部门 IDunsigned 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 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处

Title - Artist
0:00