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