アクセサとミューテタを使用してデータの加工を楽に行う(laravel Eloquent)
今回は 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_name
と first_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のデータを加工してフロントに渡す場合もとても便利な機能なので、
ぜひ使ってみてくださいね!
Discussion