*/ public static function items(?int $limit = 9): Collection { $portal = Portal::tryFrom((string) config('app.theme')) ?? Portal::Businessportal24; $language = app()->getLocale(); $cacheKey = WebPageCache::key('category-nav', [$portal->value, $language, $limit ?? 'all']); return WebPageCache::remember( $cacheKey, static fn (): Collection => self::query($portal, $language, $limit) ); } /** * @return Collection */ private static function query(Portal $portal, string $language, ?int $limit): Collection { $portalValues = [$portal->value, Portal::Both->value]; return Category::query() ->with(['translations' => fn ($query) => $query->where('locale', $language)]) ->withCount([ 'pressReleases as published_count' => function (Builder $query) use ($portalValues, $language): void { $query ->withoutGlobalScope(PortalScope::class) ->whereIn('portal', $portalValues) ->where('status', PressReleaseStatus::Published) ->where('language', $language) ->whereNotNull('published_at'); }, ]) ->whereIn('portal', $portalValues) ->where('is_active', true) ->whereNull('parent_id') ->orderByDesc('published_count') ->orderBy('id') ->when($limit !== null, fn (Builder $query) => $query->limit($limit)) ->get() ->map(function (Category $category): ?array { $translation = $category->translations->first(); if (! $translation || ! $translation->slug) { return null; } return [ 'label' => $translation->name, 'slug' => $translation->slug, 'href' => route('kategorie', ['slug' => $translation->slug]), ]; }) ->filter() ->values(); } }