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
|
|
@ -184,6 +184,41 @@ class PressRelease extends Model
|
|||
return $query->whereHas('boosts', fn (Builder $q) => $q->active());
|
||||
}
|
||||
|
||||
/**
|
||||
* Eine veröffentlichte PM: freigegebener Status mit gesetztem Datum. Bewusst
|
||||
* OHNE Zeitschranke, damit Statistik-Fenster (z. B. „letzte 7 Tage") frei auf
|
||||
* `published_at` einschränken können. Single Source of Truth für die
|
||||
* öffentlichen Web-Abfragen.
|
||||
*/
|
||||
public function scopePublished(Builder $query): Builder
|
||||
{
|
||||
return $query->where('status', PressReleaseStatus::Published)
|
||||
->whereNotNull('published_at');
|
||||
}
|
||||
|
||||
/**
|
||||
* Öffentlich sichtbare PM im Archiv: veröffentlicht UND der Termin liegt nicht
|
||||
* in der Zukunft (`published_at <= jetzt`). Basis für alle Listen-/Detail-/
|
||||
* Lead-Abfragen der Web-Seiten.
|
||||
*/
|
||||
public function scopeVisibleInArchive(Builder $query): Builder
|
||||
{
|
||||
return $query->published()->where('published_at', '<=', now());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param list<string> $portalValues
|
||||
*/
|
||||
public function scopeForPortalValues(Builder $query, array $portalValues): Builder
|
||||
{
|
||||
return $query->whereIn('portal', $portalValues);
|
||||
}
|
||||
|
||||
public function scopeForLanguage(Builder $query, string $language): Builder
|
||||
{
|
||||
return $query->where('language', $language);
|
||||
}
|
||||
|
||||
/**
|
||||
* Beschränkt auf PMs, die dem User gehören (als Autor) oder zu einer ihm
|
||||
* zugeordneten Firma. Bewusst ohne Portal-GlobalScope: ein Kunde darf
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue