BLOG

ブログ

2021/12/14 技術系

【Laravel】アクセサとミューテタについて

この記事を書いた人 K.M

こんにちは!
今回はLaravelのアクセサとミューテタという機能について書いていきます。
私が今行っている業務で既存のコードを読んでいた時にこの機能を知らずにハマってしまいました(汗
その点も含め、備忘録として書かせていただきます。

そもそもアクセサ、ミューテタとは?

ひとことで言うと、どちらもデータを加工する機能です。
アクセサというのが、データベースからデータを取得する時にデータを加工する機能で、
ミューテタというのが、アクセサの逆でデータをデータベースに保存する時にデータを加工する機能です。

公式ドキュメント

アクセサの使用例①

アクセサは以下のように、モデルにget◯◯Attributeという名前でメソッドを作成することで使用することができます。
◯◯の部分に作成したいプロパティ名をアッパーキャメルケースで記述します。

例としてusersテーブルにfirst_nameというカラムがあり、全て小文字のアルファベットでデータが保存されているとして、
まずはUserモデルに以下のような記述をします。

public function getFirstNameAttribute($value)
{
	return ucfirst($value);
}

このように記述することで、first_nameカラムにアクセスした時に取得できるデータの加工をすることができます。
上記ではucfirstメソッドを使用して、頭文字のみ大文字に変換していますので、’taro’というデータがあった場合、’Taro’という形で取得できます。

アクセサの使用例②と私がハマった点

アクセサは既存のカラムを使用して、新しい値を定義することもできます。
例としてusersテーブルにfirst_namelast_nameというカラムがあったとして、これを加工してfull_nameという項目を作成したいと思います。
Userモデルに以下のように記述します。

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

これで、full_nameというデータを使用できるようになりました。
以下のように記述することでこのデータにアクセスすることができます。

$user = App\User::find(1);

$fullName = $user->full_name;

使用するときはプロパティ名をスネークケースで記述します。
このようにあたかもfull_nameというカラムが存在するかのように記述することができます。

私が実際にハマったのは上記に書いた通り、あたかもそのカラムが存在するかのように書けるため、
{{ $user->full_name }}のようにViewやControllerで、存在しないカラムのプロパティがいくつも記述されており、戸惑ってしまいました(汗汗
モデルを眺めてたら、それっぽい名前のメソッドを見つけて、そこから調べて解決しました!

ミューテタの使用例

ミューテタの場合はset○◯Attributeという名前のメソッドを作成することで使用することができます。命名規則はアクセサと同様です。

public function setFirstNameAttribute($value)
{
	$this->attributes['first_name'] = strtolower($value);
}

例ではstrtolowerメソッドを使用し、受け取った文字列を全て小文字にしています。

$user = App\User::find(1);

$user->first_name = 'Taro';
$user->save();

Controller側から上記のように値をセットし保存すると、'Taro''taro' と加工された形で保存されます。

終わりに

今回はアクセサとミューテタについて、簡単にですが紹介させていただきました。
私自身この機能を知らずにハマってしまいましたが、勉強してみてとても便利だなと感じました。
やりすぎるとごちゃごちゃしそうな気がしますが、しっかり使いこなせば、Controller側でデータの変換などしなくてよくなるので、ソースコードもすっきりするのかなと思います。

アーカイブ