PHP/Laravel プログラミング

Laravelのアクセサ/ミューテタの使い方を解説

投稿日:

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のアクセサとミューテタの使い方について解説しました。

データの加工についてはそれぞれ個別でコントローラーやサービスクラスなどで行うこともあるでしょうが、毎回行うような加工についてはアクセサやミューテタを使って加工してあげることで、共通化できコードの記述量を減らすことができ、結果として可読性の良い綺麗なコードを書くことにつながるでしょう。

ぜひこの記事を参考にアクセサやミューテタを使ってみてくださいね。

-PHP/Laravel, プログラミング

Copyright© みぎさんドットコム , 2022 All Rights Reserved Powered by STINGER.