PHP
Using Eloquent Accessors and Mutators
Learn to define accessors and mutators in Laravel Eloquent models to automatically format attribute values upon retrieval or transform them before saving to the database.
// app/Models/User.php
namespace App/Models;
use Illuminate/Database/Eloquent/Casts/Attribute;
use Illuminate/Database/Eloquent/Factories/HasFactory;
use Illuminate/Database/Eloquent/Model;
class User extends Model
{
use HasFactory;
protected $fillable = ['first_name', 'last_name', 'email'];
// Accessor for full_name
protected function fullName(): Attribute
{
return Attribute::make(
get: fn () => "{$this->first_name} {$this->last_name}",
);
}
// Mutator for first_name (example: always capitalize)
protected function firstName(): Attribute
{
return Attribute::make(
set: fn (string $value) => ucfirst($value),
);
}
// Combined Accessor/Mutator for email (example: force lowercase before save, get as is)
protected function email(): Attribute
{
return Attribute::make(
set: fn (string $value) => strtolower($value),
);
}
}
// Usage example:
$user = new User;
$user->first_name = 'john';
$user->last_name = 'DOE';
$user->email = '[email protected]';
$user->save();
// Accessors automatically format
echo $user->first_name; // Output: John
echo $user->full_name; // Output: John DOE
echo $user->email; // Stored as [email protected]
How it works: Accessors and mutators allow you to transform Eloquent attribute values when you retrieve or set them on a model instance. Accessors (via `get:`) run when an attribute is accessed, useful for formatting or computing derived values. Mutators (via `set:`) run when an attribute is set, useful for data cleaning or encryption before saving to the database. Laravel 9+ uses the `Attribute` class for a cleaner, unified syntax.