Erläutert, wie Sie Attributwerte von Eloquent-Modellen beim Lesen und Schreiben transformieren. Vermittelt die Definition von Accessors und Mutators sowie die Verwendung der eingebauten Casts anhand praktischer Beispiele.
Für einen Accessor fügen Sie eine protected Methode zum Modell hinzu. Der Methodenname folgt CamelCase-Konvention, der Rückgabetyp ist Illuminate\Database\Eloquent\Casts\Attribute.
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Casts\Attribute;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * Liefert den Vornamen des Nutzers. */ protected function firstName(): Attribute { return Attribute::make( get: fn (string $value) => ucfirst($value), ); }}
Die get-Closure erhält den Rohwert aus der Datenbank. Auf der Modellinstanz greifen Sie über die Property first_name zu.
$user = User::find(1);$firstName = $user->first_name; // Wert nach ucfirst()
Wenn Sie den vom Accessor berechneten Wert in JSON- oder Array-Ausgaben aufnehmen möchten, tragen Sie ihn in der $appends-Property des Modells als Snake-Case ein.
Die get-Closure kann als zweites Argument $attributes erhalten (alle Attribute des Modells). Damit können Sie mehrere Spalten zu einem Wertobjekt kombinieren.
use App\Support\Address;use Illuminate\Database\Eloquent\Casts\Attribute;protected function address(): Attribute{ return Attribute::make( get: fn (mixed $value, array $attributes) => new Address( $attributes['address_line_one'], $attributes['address_line_two'], ), );}
Accessors, die Wertobjekte zurückgeben, cachet Eloquent automatisch, sodass dieselbe Instanz zurückgegeben wird. Möchten Sie auch primitive Typen wie Strings oder Zahlen cachen, rufen Sie shouldCache() auf.
Casts sind eine bequeme Möglichkeit, Typkonvertierungen deklarativ zu definieren, ohne dafür Accessors und Mutators zu schreiben. Über die Methode casts() Ihres Modells geben Sie ein Array zurück.
Attribute mit null-Wert werden nicht gecastet. Legen Sie außerdem keine Casts an, deren Name dem einer Relation entspricht, und wandeln Sie den Primärschlüssel nicht per Cast um.
Der Standard-array-Cast führt zu einem Fehler, wenn Sie einzelne Array-Offsets direkt ändern möchten. Mit AsArrayObject und AsCollection umgehen Sie dieses Problem.
use Illuminate\Database\Eloquent\Casts\AsArrayObject;use Illuminate\Database\Eloquent\Casts\AsCollection;protected function casts(): array{ return [ 'options' => AsArrayObject::class, // wie ein ArrayObject behandeln 'tags' => AsCollection::class, // wie eine Collection behandeln ];}
Für eine eigene Collection-Klasse verwenden Sie using().
use App\Collections\TagCollection;use Illuminate\Database\Eloquent\Casts\AsCollection;protected function casts(): array{ return [ 'tags' => AsCollection::using(TagCollection::class), ];}
Wenn Sie ein Format angeben, wird dieses bei der JSON-Serialisierung verwendet.
protected function casts(): array{ return [ 'published_at' => 'datetime:Y-m-d', ];}
Möchten Sie das Standard-Serialisierungsformat für alle Datumsfelder ändern, überschreiben Sie serializeDate() (das Speicherformat in der Datenbank bleibt davon unberührt).
use DateTimeInterface;protected function serializeDate(DateTimeInterface $date): string{ return $date->format('Y-m-d');}
Mit immutable_datetime erhalten Sie statt eines Carbon-Objekts eine CarbonImmutable-Instanz. Da sich diese Instanz beim Manipulieren nicht ändert, lässt sich damit besonders nebeneffektfreier Code schreiben.