123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- <?php
- namespace App\Models;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Database\Eloquent\Collection;
- class SiteAlbumFolder extends Model
- {
- protected $table = 'site_album_folder';
- // 定义与自身的关系,用于获取子文件夹
- public function children()
- {
- return $this->hasMany(SiteAlbumFolder::class, 'parent_id');
- }
- // 递归构建父子关系树
- public static function buildTree(Collection $folders, $parentId = null)
- {
- return $folders
- ->where('parent_id', $parentId) // 过滤出当前层级的文件夹
- ->sortByDesc('order') // 按顺序排序
- ->map(function ($folder) use ($folders) {
- // 递归获取子文件夹
- $folder->children = self::buildTree($folders, $folder->id);
- return [
- 'id' => $folder->id,
- 'title' => $folder->title,
- 'parent_id' => $folder->parent_id,
- 'order' => $folder->order,
- 'folder_type' => $folder->folder_type,
- 'show_tabs' => $folder->show_tabs,
- 'enabled' => $folder->enabled,
- 'created_at' => $folder->created_at,
- 'updated_at' => $folder->updated_at,
- 'cover' => $folder->cover,
- 'children' => $folder->children->values()->toArray(), // 子文件夹数据
- ];
- })
- ->values(); // 重置键名
- }
- //
- public static function getfolderTreeIds($title)
- {
- // 获取所有文件夹记录并预加载子级
- $folders = self::with('children')->get()->toArray();
- $ids = [];
- // 递归遍历查找目标标题的节点及其子节点
- array_walk($folders, function ($folder) use ($title, &$ids) {
- if ($folder['title'] == $title) {
- self::collectIdsRecursive($folder, $ids);
- }
- });
- return array_unique($ids); // 去重后返回
- }
- /**
- * 递归收集节点及其子节点ID
- */
- protected static function collectIdsRecursive($node, &$ids)
- {
- $ids[] = $node['id'];
- if (!empty($node['children'])) {
- array_walk($node['children'], function ($child) use (&$ids) {
- self::collectIdsRecursive($child, $ids);
- });
- }
- }
- }
|