public function lisonkk() { // 从哪一个节点开始的ID $this->refreshCount(285);}
/** * 更新分类统计(一个方法到底) */ public function refreshCount(?int $startId = null) { // ===== 1. 一次性加载所有数据 ===== $categories = Db::name('aa')->field('id, pid')->select()->toArray(); $childrenMap = []; $countMap = []; // 初始化 countMap foreach ($categories as $item) { $countMap[(int)$item['id']] = 0; } // 加载 CC 表统计(只在这里出现) $stats = Db::table('cc') ->field('aid, COUNT(*) AS total') ->group('aid') ->select() ->toArray(); foreach ($stats as $row) { $aid = (int)$row['aid']; if (isset($countMap[$aid])) { $countMap[$aid] = (int)$row['total']; } } // 构建 childrenMap foreach ($categories as $item) { $pid = (int)$item['pid']; $id = (int)$item['id']; $childrenMap[$pid][] = $id; } // ===== 2. 确定起始节点 ===== if ($startId !== null) { $targetIds = [(int)$startId]; } else { $allIds = array_keys($countMap); $rootPids = array_diff(array_keys($childrenMap), $allIds); $targetIds = []; foreach ($rootPids as $pid) { foreach ($childrenMap[$pid] ?? [] as $id) { $targetIds[] = $id; } } } // ===== 3. 递归更新 ===== foreach ($targetIds as $id) { $this->calcAndUpdate($id, $childrenMap, $countMap); } return '分类统计完成'; } /** * 仅递归累加 + 逐条更新 */ private function calcAndUpdate(int $id, array &$childrenMap, array &$countMap): int { $total = $countMap[$id] ?? 0; foreach ($childrenMap[$id] ?? [] as $childId) { $total += $this->calcAndUpdate($childId, $childrenMap, $countMap); } Db::name('aa') ->where('id', $id) ->update([ 'count' => $total ]); return $total; }