【Laravel】アクセサとミューテタの使い方|モデルの属性を自在に変換するテクニック

【Laravel】アクセサとミューテタの使い方|モデルの属性を自在に変換するテクニック Laravel

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)
    );
}

このように、取得時と保存時で異なる処理を設定することも可能です。

まとめ

アクセサとミューテタは、モデルの属性をより柔軟に扱うための強力な仕組みです。表示用に整形したり、保存前に加工したりと、アプリケーションの品質や保守性を高めるために役立ちます。

特に、パスワードのハッシュ化や名前の整形、日付や電話番号のフォーマット統一など、実務での応用範囲は広いため、積極的に活用していきましょう。