のぐそんブログ

暗いおじさんがシコシコ書くブログです。

Laravelのアクセサとミューテータについてのメモ

アクセサとは

アクセサを利用すると独自のプロパティを取り出したり、既存のプロパティを上書きして取り出すことができます。

アクセサはModelに以下のような形で定義すると実装することができます。 プロパティ名はキャメルケース(camelCase)で定義します。

    public function get{プロパティ名}Attribute()
    {
        ...
        return 値;
    }

view側ではプロパティ名をスネークケース(snake_case)で定義することで値を受け取ることができます。

実装例

以下のようなテーブルがあるとします。

テーブル名:users

id name age
1 佐藤 40
2 加藤 30
3 斎藤 20

◎app/User.php

モデルは以下のような感じです。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Person extends Model
{
    public function getNameAndIdAttribute()
    {
        return '私は' . $this->name .'です。年齢は' . $this->age . 'です。' ;
    }
}

@app/Http/Controllers/HelloController.php

class HogeController extends Controller
{


    public function index(Request $request)
    {

        $result = User::get();
        $data = [
            'data' => $result
        ];

        return view('hoge.index', $data);
    }
}

@/resources/views/hoge/index.blade.php

@foreach($data as $item)
    <li>
        // プロパティ名のスネークケースを定義する
         {{$item->name_and_id}}
    </li>
@endforeach

表示は以下になります。

・私は佐藤です。年齢は40です。
・私は加藤です。年齢は30です。
・私は斎藤です。年齢は20です。

ミューテータ

ミューテータはプロパティの値の設定する処理を上書きすることができます。

アクセサはModelに以下のような形で定義すると実装することができます。 プロパティ名はキャメルケース(camelCase)で定義します。

    public function set{プロパティ名}Attribute()
    {
        ...
    }

実装例

◎app/User.php

モデルは以下のような感じです。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Person extends Model
{
    public function setAgeAttribute($value)
    {
        $this->attributes['name'] = $value + 10;
    }
}

@app/Http/Controllers/HelloController.php

class HogeController extends Controller
{
    public function update($id,$age)
    {
        $record = Person::find($id);
        $record->age = $age;
        $record->save();
        return redirect('/hoge');
    }
}

routes/web.php

Route::get('/hoge/{id}/{age}', 'HelloController@update');

hoge/1/10でアクセスした場合の表示は以下になります。

・私は佐藤です。年齢は20です。 // setAgeAttributeが実行される