LaravelのEloquentモデルには、属性の値を動的に加工・変換できるアクセサ(Accessor)とミューテタ(Mutator)という便利な機能が用意されています。これにより、データベース上の値と、アプリケーション内で扱う値を切り分けて、柔軟なデータ操作が可能になります。
この記事では、アクセサとミューテタの基本的な使い方から、実践的な活用例までを解説します。
アクセサとは?
アクセサ(Accessor)は、モデルの属性を取得する際に、データを加工して返すためのメソッドです。
例えば、名前を常に「姓+名」で結合して取得したい場合などに使います。
アクセサの定義方法(Laravel 9以降)
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Model
{
protected function fullName(): Attribute
{
return Attribute::get(function () {
return $this->last_name . ' ' . $this->first_name;
});
}
}
このように定義しておくと、$user->full_name
で結合済みの名前を取得できます。
アクセサを使った取得例
$user = User::find(1);
echo $user->full_name; // 例: 山田 太郎
ミューテタとは?
ミューテタ(Mutator)は、モデルにデータをセットするタイミングで値を加工する機能です。たとえば、パスワードを自動でハッシュ化したり、大文字・小文字を統一したりするのに便利です。
ミューテタの定義方法
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Support\Facades\Hash;
class User extends Model
{
protected function password(): Attribute
{
return Attribute::make(
set: fn ($value) => Hash::make($value),
);
}
}
このように定義しておくと、$user->password = '123456'
のようにセットしたときに、自動的にハッシュ化されます。
旧バージョン(Laravel 8以前)の書き方
Laravel 8以前では、以下のように getXxxAttribute()
や setXxxAttribute()
という命名規則で定義します。
// アクセサ(取得時)
public function getFullNameAttribute()
{
return $this->last_name . ' ' . $this->first_name;
}
// ミューテタ(設定時)
public function setPasswordAttribute($value)
{
$this->attributes['password'] = Hash::make($value);
}
Laravel 9以降もこの方法は使えますが、Attribute::make()
を使った書き方が推奨されています。
アクセサ・ミューテタの活用例
例1:日付のフォーマットを整える
protected function createdAt(): Attribute
{
return Attribute::get(function ($value) {
return \Carbon\Carbon::parse($value)->format('Y年m月d日');
});
}
例2:電話番号のフォーマットを統一
protected function phone(): Attribute
{
return Attribute::make(
get: fn ($value) => preg_replace('/(\d{3})(\d{4})(\d{4})/', '$1-$2-$3', $value),
set: fn ($value) => preg_replace('/[^0-9]/', '', $value)
);
}
このように、取得時と保存時で異なる処理を設定することも可能です。
まとめ
アクセサとミューテタは、モデルの属性をより柔軟に扱うための強力な仕組みです。表示用に整形したり、保存前に加工したりと、アプリケーションの品質や保守性を高めるために役立ちます。
特に、パスワードのハッシュ化や名前の整形、日付や電話番号のフォーマット統一など、実務での応用範囲は広いため、積極的に活用していきましょう。