【Laravel】アクセサとミューテタとは?

Laravel

アクセサとは

データをDBから取得時に、フォーマットを予め設定することができます。

例えとして、Userモデルでユーザーの名前(アルファベット)の取得時に、常に頭文字を大文字にするケースを見てみましょう。

ucfirst 関数で、最初の文字がアルファベットであれば、大文字にしています。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザーの名前の取得
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

これで値を設定できるようになりました。

設定として、関数名はget{カラム名}Attributeとします。
カラム名は、アッパーキャメルケース(最初のアルファベットを大文字にする)とするお作法となっています。
今回の例だと、first_nameカラムに対してはgetFirstNameAttributeとなりますね。

あとは、コントローラーでfirst_name属性にアクセスすると見れるようになります。

use App\Models\User;

$user = User::find(1);

$firstName = $user->first_name;

また、モデルで新しい関数を作ることもできます。

/**
 * ユーザーのフルネームの取得
 *
 * @return string
 */
public function getFullNameAttribute()
{
    return "{$this->first_name} {$this->last_name}";
}

コントローラーでこのように記述すると、first_nameとlast_nameが一緒になったフルネームを取り出しできるようになります。

use App\Models\User;

$user = User::find(1);

$full_name = $user->full_name;

ミューテタとは

ミューテタは、アクセサの逆です。
データをDBに保存する前に、フォーマットを予め設定することができます。

設定として、関数名はset{カラム名}Attributeとなっています。
同様に、アッパーキャメルケースです。

ミューテタの場合はgetでなくsetですね。
DBに値を入れる時なのでイメージがつきやすいのではと思います。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザーの名前を設定
     *
     * @param  string  $value
     * @return void
     */
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = strtolower($value);
    }
}

strtolower 関数で、文字列を小文字にしています。
例えばUserControllerがあるとして、以下のような書き方であっても、小文字として入力されるようになります。

user = new User();
$member->first_name = 'Bob';
$member->save();

なお、色々文献調べてましたが、Laravelで登録処理を作ってるなかで、created_atやupdated_atは自動で入る(ように感じる)ところも、ミューテタやアクセサが使われてるそうです。
Laravel特有の便利機能、実は普段から使っているっていうことは多々ありますね…。

まとめ

・アクセサは、データをDBから取得時に、フォーマットを予め設定することができる
・関数名の書き方は、get{アッパーキャメルケースでのカラム名}Attribute
・ミューテタは、データをDBに保存する前に、フォーマットを予め設定できる
・関数名の書き方は、set{アッパーキャメルケースでのカラム名}Attribute

主にリーダブルを参考にしながら記載しました。

Eloquent:ミューテタ/キャスト 8.x Laravel

コメント

タイトルとURLをコピーしました