アクセサとミューテタを使用してデータの加工を楽に行う(laravel Eloquent)

1 min read読了の目安(約1700字

今回は Laravelのアクセサ・ミューテタ機能を紹介します。

アクセサはDBからデータを取得してフロント側にデータ加工して返したい場合、ミューテタはDBにデータを保存する際にデータを加工したい場合に役立ちます。

アクセサを使用する

アクセサはDBからのデータ取得時にデータを加工できます。
関数名を get〇〇Attribute という名前にすればLaravelは自動的にアクセサだ!と判断してくれます。

DBにあるデータを同じ項目名でフロントに返す場合

DBに created_at という項目がタイムスタンプ型で存在していて、
フロントに created_at という項目名のまま「2021年01月01日」という書式でデータを返したい場合です。

public function getCreatedAtAttribute($value)
{
    return Carbon::parse($value)->format('Y-m-d');
}

引数の $value には自動でDBの created_at のデータが渡されるので、$value を加工して返します。

こちらがbeforeで

>>> $user->created_at
=> Illuminate\Support\Carbon @1604575769 {#2212
     date: 2020-11-05 20:29:29.0 Asia/Tokyo (+09:00),
   }

こちらがAfterです

>>> $user->created_at
=> "2020-11-05"

DBにある項目を使って、新しい項目名でフロントにデータを返す場合

DBに last_namefirst_name という項目があるとします。

フロント側にはフルネームで返したい場合はこのように記述します。

protected $appends = ['full_name']; // 追記

public function getFullNameAttribute()
{
    return $this->last_name . ' ' . $this->first_name;
}

これで、 full_name という名前でデータにアクセスすることができます。

>>> $user->full_name
=> "田中 太郎"

ミューテタを使用する

ミューテタはデータをDBに保存する際にデータを加工することができます。
関数名を set〇〇Attribute という名前にすればLaravelは自動的にミューテタだ!と判断してくれます。

例えば、入力された郵便番号をハイフンを取り除いて半角に変換してDBに入れたいと仮定します。

public function setPostalCodeAtribute($attribute)
{
    $postalCodeNumber = (int) str_replace("-", "", $postalCode); // ハイフンを削除してint型に変換
    return mb_convert_kana($attribute,'n'); // 半角に変換する
}

このようにすれば、 文字列で "100-0001" という値が来た場合、DBには 「1100001」で入ります。

あくまで例ですので、ご自身に合った活用法をしてみてください。

終わりに

今回はアクセサとミューテタについて解説してみました。

Controllerで毎回DBに保存する際に加工している場合はアクセサを使えばControllerの記述が減りますし、DBのデータを加工してフロントに渡す場合もとても便利な機能なので、
ぜひ使ってみてくださいね!