strtolower(trim((string) $r)), $roles))); $cacheKey = 'navbar_' . md5(json_encode($roles)); return Cache::remember($cacheKey, 300, function () use ($roles) { $allowedIds = RoleNavItem::getNavItemIdsForRoles($roles); if (empty($allowedIds)) { return []; } $rows = NavItem::query() ->where('is_enabled', 1) ->orderBy('sort_order', 'asc') ->get() ->toArray(); $byId = []; foreach ($rows as $row) { if (in_array((int) $row['id'], $allowedIds, true)) { $row['children'] = []; $byId[$row['id']] = $row; } } $tree = []; foreach ($byId as $id => &$node) { $pid = $node['menu_parent_id'] ?? null; if ($pid && isset($byId[$pid])) { $byId[$pid]['children'][] = &$node; } else { $tree[] = &$node; } } unset($node); return $tree; }); } public function clearCache(): void { Cache::flush(); } }