场景:需要给内部系统增加系统组织架构 部门的层级是可以无限添加的
1. mysql表结构如下
CREATE TABLE `department` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '部门名称',
`pid` int NOT NULL DEFAULT '0' COMMENT '上级部门ID',
`director` int NOT NULL DEFAULT '0' COMMENT '部门主管ID',
`last_operator` int NOT NULL DEFAULT '0' COMMENT '最后操作人',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门表';
2. 模型关联关系
创建DepartmentModel(不多叙述 基操)
模型关联关系如下
public function child()
{
return $this->hasMany(self::class,'pid');
}
// 递归子级
public function children()
{
return $this->child()->with('children');
}
public function father()
{
return $this->hasMany(self::class,'id','pid');
}
// 递归父级
public function parents()
{
return $this->father()->with('parents');
}
3. 具体使用
/**
* 递归部门列表
* @return object
*/
public function treeList(): object
{
$query = Department::query();
$query = $query->where('pid', 0);
$query = $query->with(['children']);
return $query->get();
}
4. 给递归数组增加层级标识(增加字段表明第几层数组 level)
/**
* 给树形结构数据计算层级字段 Level
* @param $list
* @param int $level 数据当前层级
* @return object
*/
public function addGenLevel(&$list, $level = 0): object
{
$level = $level + 1;
foreach ($list as &$value) {
if (!empty($value['children'])) {
$this->addGenLevel($value['children'], $level);
}
$value['level'] = $level;
}
return $list;
}
结束~~