laravel利用模型关联递归查询(无限层级)

场景:需要给内部系统增加系统组织架构 部门的层级是可以无限添加的

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;
    }

结束~~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值