Webアプリケーションを開発する際にデータベースからデータを取得し加工してフロントエンドにレスポンスを返したり、フロントエンドからリクエストされたデータを加工して保存することがよくあります。
そんな時にLaravelではアクセサとミューテタという機能を簡単に利用できる仕組みが用意されています。
今回はLaravelのモデルで定義することができるアクセサ/ミューテタの使い方を解説していきます。
アクセサ/ミューテタとは
アクセサとは、データベースから取得したデータを加工する処理のことを言います。
ミューテタはデータを保存する時に加工する処理のことを言います。
アクセサを実装する
それではまず、アクセサを実装してみましょう。
アクセサを定義するにはモデルでget〇〇Attributeメソッドを作成します。
〇〇にはキャメルケースで記述します。
例えばfooという属性を定義したい場合には、getFooAttributeメソッドを定義します。
今回は、usersテーブルにfirst_nameカラムとlast_nameカラムが存在するUserモデルにフルネームを返すアクセサを定義してみましょう。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $append = ['full_name'];
public function getFullNameAttribute()
{
return $this->first_name . " " . $this->last_name;
}
}
getFullNameAttributeメソッドを定義するだけでLaravelがアクセサだと判断して、full_name属性が作られます。
Userモデルのインスタンスを作成し、full_nameプロパティでfirst_nameとlast_nameを文字列連結した値を取得することができます。
$user = User::find(1);
$user->full_name
また、JSONレスポンスにアクセサを含めたい場合はモデルで$appendsプロパティを定義して、アクセサで定義した属性を指定してあげてください。
ミューテタを実装する
続いては、ミューテタを実装してみましょう。
ミューテタはモデルにset〇〇Attributeメソッドを定義します。
こちらも〇〇にはキャメルケースで記述します。
例えば、fooという属性で定義したい場合、setFooAttributeメソッドになります。
今回はfirst_nameカラムにデータを保存する前に加工して保存するようにしたいと思います。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}
}
ミューテタの引数の$valueに設定したい値が入ってきます。
$valueの値をstrtolowerで小文字に変換してから保存するようにしています。
保存する際には下記のように記述します。
$user = User::find(1);
$user->first_name = 'Sally';
$user->save();
ミューテタで小文字に変換するようにしてから加工していますので、’Sally’で保存しようとしてもデータベースには’sally’で保存されています。
まとめ
今回はLaravelのアクセサとミューテタの使い方について解説しました。
データの加工についてはそれぞれ個別でコントローラーやサービスクラスなどで行うこともあるでしょうが、毎回行うような加工についてはアクセサやミューテタを使って加工してあげることで、共通化できコードの記述量を減らすことができ、結果として可読性の良い綺麗なコードを書くことにつながるでしょう。
ぜひこの記事を参考にアクセサやミューテタを使ってみてくださいね。