ブログ
【Laravel】アクセサとミューテタについて
こんにちは!
今回はLaravelのアクセサとミューテタという機能について書いていきます。
私が今行っている業務で既存のコードを読んでいた時にこの機能を知らずにハマってしまいました(汗
その点も含め、備忘録として書かせていただきます。
そもそもアクセサ、ミューテタとは?
ひとことで言うと、どちらもデータを加工する機能です。
アクセサというのが、データベースからデータを取得する時にデータを加工する機能で、
ミューテタというのが、アクセサの逆でデータをデータベースに保存する時にデータを加工する機能です。
公式ドキュメント
アクセサの使用例①
アクセサは以下のように、モデルにget◯◯Attribute
という名前でメソッドを作成することで使用することができます。
◯◯の部分に作成したいプロパティ名をアッパーキャメルケースで記述します。
例としてusersテーブルにfirst_name
というカラムがあり、全て小文字のアルファベットでデータが保存されているとして、
まずはUserモデルに以下のような記述をします。
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
このように記述することで、first_name
カラムにアクセスした時に取得できるデータの加工をすることができます。
上記ではucfirst
メソッドを使用して、頭文字のみ大文字に変換していますので、’taro’というデータがあった場合、’Taro’という形で取得できます。
アクセサの使用例②と私がハマった点
アクセサは既存のカラムを使用して、新しい値を定義することもできます。
例としてusersテーブルにfirst_name
とlast_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側でデータの変換などしなくてよくなるので、ソースコードもすっきりするのかなと思います。
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!