Berechnete Felder ohne Datenbankspalte
Berechnete Felder ohne Datenbankspalte
~13 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
NICHT jedes Feld in der API-Antwort muss aus einer Datenbankspalte kommen – ein GETTER ohne zugehöriges #[ORM\Column] reicht bereits aus.
isRecent als berechnetes Feld
#[Groups(['project:read'])]
public function isRecent(): bool
{
$sevenDaysAgo = new \DateTimeImmutable('-7 days');
return $this->createdAt > $sevenDaysAgo;
}KEIN #[ORM\Column], KEINE Property – NUR eine öffentliche Methode namens isX() mit #[Groups] davor. API Platform (genauer: der zugrunde liegende Symfony Serializer) erkennt is*()- UND get*()-Methoden AUTOMATISCH als serialisierbare Properties.
Das Ergebnis prüfen
curl -k https://localhost/api/projects/1{
"id": 1,
"name": "Website-Relaunch",
"description": "Kompletter Redesign",
"createdAt": "2026-08-06T12:00:00+00:00",
"isRecent": true
}isRecent im JSON, OBWOHL die Datenbanktabelle KEINE entsprechende Spalte besitzt – der Wert wird bei JEDER Anfrage NEU berechnet, ist also IMMER aktuell, im Gegensatz zu einem gespeicherten, potenziell VERALTETEN Wert.
Wann berechnete Felder sinnvoll sind
- Werte, die sich aus BEREITS vorhandenen Feldern ableiten (wie
isRecentauscreatedAt). - Aggregationen über Beziehungen, z. B. eine Task-Anzahl (relevant AB Block 5, sobald
ProjectmitTaskverknüpft ist). - Formatierte Darstellungen für das Frontend, z. B. ein fertig zusammengesetzter Anzeigename.
Achtung: Berechnete Felder sind NUR lesbar (normalizationContext), NIEMALS gleichzeitig in denormalizationContext – es gibt KEIN Setter-Gegenstück, ein Schreibversuch würde schlicht INS LEERE laufen.
Tipp: Performance-Hinweis: berechnete Felder, die auf BEZIEHUNGEN zugreifen (Kapitel 41+), können zu N+1-Datenbankabfragen führen, falls die Beziehung nicht vorab geladen wird – dieses Thema wird in Block 5 vertieft, sobald echte Relationen existieren.