こんにちは!そーたです!
今回は、プログラミングについての記事を書こうと思います!
Laravelのアクセサとミューテタという機能についてです!

・アクセサとミューテタってそもそもなんなの?
・アクセサとミューテタを聞いたことがあるけど、実際にどう使ったらいいかいまいちわかっていない、、、
こんな悩みをお持ちの方におすすめの記事となっています。
- アクセサ
- アクセサとは?
- 使い方
- 具体例
- ミューテタ
- ミューテタとは?
- 使い方
- 具体例
- まとめ
現在、webエンジニアとして働き始めたばかりでして、実務で得た学びをアウトプットしようと考えています。
第1回目は、Laravelのデータ加工機能であるアクセサとミューテタについてご紹介します!
この記事を読むことで、アクセサとミューテタがどういったもので、どう使うのかがわかるようになると思います。
3分で読めるので、アクセサとミューテタについて知りたい方は最後まで読んでみてください。
アクセサ
アクセサとは?
アクセサとは、データベースから取得したデータを任意の形にフォーマットするためのメソッドです。
アクセサを使うことによって、モデルですでに加工済みのデータをフロント側に返すことができます。
使い方
class User extends Model
{
/**
* ユーザーのファーストネームを取得
*
* @param string $value
* @return string
*/
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
}
get***Attributeの***の箇所に、使用したいプロパティ名を指定します。
上記の例で言うと、「FirstName」が、プロパティ名として使用できるようになります。
使用する際は、「first_name」のスネークケースでの記述になります。
return以降に、実際に加工する処理を記載します。
具体例
例えば、idカラムとnameカラムのあるuserテーブルがあるとします。
idの値とnameの値を一緒にフロントに返したい場合は、
class User extends Model
{
public function getIdAndNameAttribute()
{
return 'id : ' . $this->id . '/ name : ' . $this->name;
}
}
と、Userモデルに定義します。
インスタンスから指定したプロパティ名を指定することで、
下記のように加工済みのデータを取得することができます。
$user->id_and_name
=> "id: 1 / name : ワイ"
ミューテタ
ミューテタとは?
データベースにデータを保存する際に、データを事前ににフォーマットするためのメソッドです。
アクセサと真逆のメソッドですね。
使い方
class User extends Model
{
/**
* ユーザーのファーストネームを設定
*
* @param string $value
* @return void
*/
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}
}
set***Attributeの***の箇所に、使用したいプロパティ名を指定します。
return以降に、実際に加工する処理を記載します。
具体例
例えば、上記のコードを例にすると、
データベース保存前に、first_nameカラムの値をstrtolowerメソッドで全て小文字に加工し保存するようにしています。
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}
インスタンスには、下記のような形で代入するだけでミューテタが機能してくれます。
user = App\User::find(1);
$user->first_name = 'Sally';
注意する点として、ミューテタはインスタンスに値を設定するときに実行されます。
保存される時に実行されるわけではないので、一応頭の片隅に置いておいた方がいいかもしれません。
まとめ
今回は、laravelのアクセサとミューテタについて簡単にご紹介させていただきました。
初学者で恐縮なのですが、アクセサの機能を知らなかった僕は、データベースのカラムにないプロパティがViewに記載されており、ハマっておりました(笑)
仕様にもよるかと思いますが、うまくアクセサ、ミューテタを用いて実装していきたいですね!
今回は、以上になります!
最後まで読んでいただきありがとうございましたmm