Optimierung 4.2: Published-Release-Query ueber PressRelease-Scopes zentralisiert
Vier komponierbare Scopes auf PressRelease:
- published() Status freigegeben + published_at gesetzt (ohne Zeitschranke,
damit Statistik-Fenster frei einschraenken koennen)
- visibleInArchive() published() + published_at <= jetzt (oeffentlich sichtbar)
- forPortalValues() whereIn portal
- forLanguage() where language
~19 duplizierte Query-Bloecke in routes/web.php (Home, Kategorie, Detail,
Veroeffentlichen, Suche, Newsrooms, Newsroom-Detail, Legacy-Redirect) nutzen
jetzt diese Scopes. Jedes withoutGlobalScope(PortalScope) bleibt an seiner
Stelle erhalten; die Klausel-Reihenfolge ist fuers Ergebnis irrelevant (reine
AND-Verknuepfung), daher verhaltensgleich.
Test: Web/PublishedReleaseScopeTest; die 89 bestehenden Web/-Tests bleiben gruen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
4c80b934ab
commit
987a5a2c42
4 changed files with 137 additions and 83 deletions
138
routes/web.php
138
routes/web.php
|
|
@ -56,11 +56,9 @@ $webHomeData = static function (Portal $primaryPortal, string $language = 'de'):
|
|||
$previousSince = $referenceNow->copy()->subDays(14);
|
||||
|
||||
$publishedQuery = static fn (): Builder => PressRelease::query()
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now());
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->visibleInArchive();
|
||||
|
||||
$with = [
|
||||
'company',
|
||||
|
|
@ -98,26 +96,24 @@ $webHomeData = static function (Portal $primaryPortal, string $language = 'de'):
|
|||
->where('is_active', true)
|
||||
->whereHas('pressReleases', function (Builder $query) use ($portalValues, $recentSince, $language): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published()
|
||||
->where('published_at', '>=', $recentSince);
|
||||
})
|
||||
->withCount([
|
||||
'pressReleases as recent_releases_count' => function (Builder $query) use ($portalValues, $recentSince, $language): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published()
|
||||
->where('published_at', '>=', $recentSince);
|
||||
},
|
||||
'pressReleases as today_releases_count' => function (Builder $query) use ($portalValues, $referenceNow, $language): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published()
|
||||
->whereDate('published_at', $referenceNow->toDateString());
|
||||
},
|
||||
])
|
||||
|
|
@ -138,17 +134,16 @@ $webHomeData = static function (Portal $primaryPortal, string $language = 'de'):
|
|||
->withCount([
|
||||
'pressReleases as recent_count' => function (Builder $query) use ($portalValues, $recentSince, $language): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->where('published_at', '>=', $recentSince)
|
||||
->whereNotNull('published_at');
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published()
|
||||
->where('published_at', '>=', $recentSince);
|
||||
},
|
||||
'pressReleases as previous_count' => function (Builder $query) use ($portalValues, $recentSince, $previousSince, $language): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published()
|
||||
->where('published_at', '>=', $previousSince)
|
||||
->where('published_at', '<', $recentSince);
|
||||
},
|
||||
|
|
@ -182,10 +177,9 @@ $webHomeData = static function (Portal $primaryPortal, string $language = 'de'):
|
|||
->withCount([
|
||||
'pressReleases as window_count' => function (Builder $query) use ($portalValues, $recentSince, $referenceNow, $language): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published()
|
||||
->where('published_at', '>=', $recentSince)
|
||||
->where('published_at', '<=', $referenceNow);
|
||||
},
|
||||
|
|
@ -200,11 +194,9 @@ $webHomeData = static function (Portal $primaryPortal, string $language = 'de'):
|
|||
|
||||
if ($spotlightCategory && $spotlightTranslation = $spotlightCategory->translations->first()) {
|
||||
$spotlightBase = static fn (): Builder => PressRelease::query()
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now())
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->visibleInArchive()
|
||||
->where('category_id', $spotlightCategory->id);
|
||||
|
||||
$spotlightReleases = $spotlightBase()
|
||||
|
|
@ -314,11 +306,9 @@ $categoryPage = static function (string $edition, string $slug) use ($applyWebDo
|
|||
|
||||
$base = static fn (): Builder => PressRelease::query()
|
||||
->withoutGlobalScope(PortalScope::class)
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now())
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->visibleInArchive()
|
||||
->whereIn('category_id', $categoryIds);
|
||||
|
||||
// Kategoriespezifischer Stichtag: jüngste Meldung dieser Branche.
|
||||
|
|
@ -373,10 +363,9 @@ $categoryPage = static function (string $edition, string $slug) use ($applyWebDo
|
|||
|
||||
$newsroomFilter = static function (Builder $query) use ($portalValues, $categoryIds, $language): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published()
|
||||
->whereIn('category_id', $categoryIds);
|
||||
};
|
||||
|
||||
|
|
@ -410,10 +399,9 @@ $categoryPage = static function (string $edition, string $slug) use ($applyWebDo
|
|||
]);
|
||||
|
||||
$publishedCount = static fn (Builder $query) => $query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at');
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published();
|
||||
|
||||
$subCategories = $childCategories
|
||||
->map(function (Category $child) use ($recentSince, $previousSince, $publishedCount): ?array {
|
||||
|
|
@ -501,11 +489,9 @@ $releaseDetailPage = static function (string $edition, string $slug) use ($apply
|
|||
$portalValues = [$portal->value, Portal::Both->value];
|
||||
|
||||
$publishedScope = static fn (Builder $query): Builder => $query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now());
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->visibleInArchive();
|
||||
|
||||
$release = PressRelease::query()
|
||||
->withoutGlobalScope(PortalScope::class)
|
||||
|
|
@ -584,11 +570,9 @@ $veroeffentlichenPage = static function (string $edition) use ($applyWebDomainCo
|
|||
|
||||
$publishedBase = static fn (): Builder => PressRelease::query()
|
||||
->withoutGlobalScope(PortalScope::class)
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now());
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->visibleInArchive();
|
||||
|
||||
$archiveTotal = $publishedBase()->count();
|
||||
$publishedToday = $publishedBase()->whereDate('published_at', $referenceNow->toDateString())->count();
|
||||
|
|
@ -612,10 +596,9 @@ $veroeffentlichenPage = static function (string $edition) use ($applyWebDomainCo
|
|||
|
||||
$newsroomFilter = static function (Builder $query) use ($portalValues, $language, $recentSince): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published()
|
||||
->where('published_at', '>=', $recentSince);
|
||||
};
|
||||
|
||||
|
|
@ -702,11 +685,9 @@ $suchePage = static function (string $edition) use ($applyWebDomainConfig) {
|
|||
|
||||
$mostReadReleases = PressRelease::query()
|
||||
->withoutGlobalScope(PortalScope::class)
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now())
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->visibleInArchive()
|
||||
->orderByDesc('hits')
|
||||
->orderByDesc('published_at')
|
||||
->limit(5)
|
||||
|
|
@ -739,11 +720,9 @@ $newsroomsIndex = static function (string $edition) use ($applyWebDomainConfig)
|
|||
|
||||
$published = static function (Builder $query) use ($portalValues, $language): void {
|
||||
$query
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now());
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->visibleInArchive();
|
||||
};
|
||||
|
||||
$activeCompanies = static fn (): Builder => Company::query()
|
||||
|
|
@ -817,11 +796,9 @@ $newsroomDetail = static function (string $edition, string $slug) use ($applyWeb
|
|||
$base = static fn (): Builder => PressRelease::query()
|
||||
->withoutGlobalScope(PortalScope::class)
|
||||
->where('company_id', $company->id)
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now());
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->visibleInArchive();
|
||||
|
||||
// Keine öffentliche Newsroom-Seite ohne veröffentlichte Meldung.
|
||||
if (! $base()->exists()) {
|
||||
|
|
@ -861,10 +838,9 @@ $newsroomDetail = static function (string $edition, string $slug) use ($applyWeb
|
|||
$query
|
||||
->withoutGlobalScope(PortalScope::class)
|
||||
->where('company_id', $company->id)
|
||||
->whereIn('portal', $portalValues)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->where('language', $language)
|
||||
->whereNotNull('published_at');
|
||||
->forPortalValues($portalValues)
|
||||
->forLanguage($language)
|
||||
->published();
|
||||
};
|
||||
|
||||
$categories = Category::query()
|
||||
|
|
@ -975,9 +951,7 @@ $htmlRedirect = static function (string $edition, string $path) {
|
|||
&& $company->is_active
|
||||
&& $company->pressReleases()
|
||||
->withoutGlobalScope(PortalScope::class)
|
||||
->where('status', PressReleaseStatus::Published)
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now())
|
||||
->visibleInArchive()
|
||||
->exists();
|
||||
|
||||
return redirect(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue