获取树结构数据

    public function getRoleFields()
    {
        $hrmAuthFuncFields = HrmAuthFuncFieldsModel::query()->valid()->get();
        $hrmAuthFuncFieldMaps = [];
        foreach ($hrmAuthFuncFields as $hrmAuthFuncField) {
            $hrmAuthFuncFieldMaps[$hrmAuthFuncField->father_id][] = $hrmAuthFuncField;
        }
        $result = self::formatFileds($hrmAuthFuncFieldMaps, 0);
        return $result;
    }

    public function formatFileds($hrmAuthFuncFieldMaps, $fatherId)
    {
        if (!isset($hrmAuthFuncFieldMaps[$fatherId])) {
            return [];
        }
        $result = [];
        $directories = $hrmAuthFuncFieldMaps[$fatherId];

        foreach ($directories as $directory) {
            $treeNode = [
                'field_name' => $directory->field_name,
                'field_des'  => $directory->field_des,
                'id' => $directory->id,
                'children' => [],
            ];
            if (!$directory->is_empty) {
                $treeNode['children'] = $this->formatFileds($hrmAuthFuncFieldMaps, $directory->id);
            }
            $result[] = $treeNode;
        }

        return $result;
    }

总的来说就是先根据father_id进行分类,然后分完类之后之后递归获取数据即可。

同样的我们需要考虑如何获取树的所有节点,然后将这些节点合并起来,我们可以这样做:

        // 查询该节点的子节点
        $directories = CatalogueModel::query()
            ->where('father_id', $parentNode->id)
            ->get();
        $allCatalogues = $directories;

        // 查询出节点下的所有目录
        while (true) {
            $nextLevelNodes = new Collection();
            foreach ($directories as $directory) {
                if ($directory->catalogue_empty) {
                    continue;
                }
                $nextLevelNodes = $nextLevelNodes->merge($directory->childCatalogues);
            }
            if (count($nextLevelNodes) === 0) {
                break;
            }
            $allCatalogues = $allCatalogues->merge($nextLevelNodes);
            $directories = $nextLevelNodes;
        }
原文地址:https://www.cnblogs.com/cjjjj/p/11077396.html