Laravel5.5でアクセサとミューテターを利用して独自属性をjsonに含めたり、データの加工などを行う!

Laravelでデータを取得する時、僕の場合はコントローラーでごにょごにょすることが多いのですが
配列データを保存したいという場面が出てきてコントローラーでserializeしていたのですが
コントローラーはごちゃごちゃになるし非合理的でモデル内で配列のserializeやunserializeできないかなといろいろ検索していたら
モデルで独自の属性を定義することができるとわかりさらいにjsonに含めたりすることができるので即効で書きかえてコントローラーをすっきりさせました。

Profileモデル

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{

    //いろいろ省略

    // $append を定義するとjsonに含まれるようになる。
    protected $appends = ['favorite_foods']; 

    // アクセサ
    // favorite_foods 配列をシリアライズして保存されているという前提
    public function getFavoriteFoodsAttribute($value)
    {
        return unserialize($value);
    }

    // ミューテタ
    // favorite_foods 配列をシリアライズして保存
    public function setFavoriteFoodsAttribute($value)
    {
        $this->attributes['favorite_foods'] = serialize($value);
    }

}

データを保存や取得する際、コントローラー内で処理をしなくてもモデルに記述することですっきり
アクセサは保存されたデータをunserializeして取得しています。
ミューテタは保存したい配列データをserializeして保存しています。

メソッドはアッパーキャメルケースとなる。
favorite_foodsが対象となる場合
アクセサは
get+FavoriteFoods+Attribute
の記述となる。
ミューテタは
set+FavoriteFoods+Attribute
となる。

独自属性を定義したい場合

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{

    //いろいろ省略

    // $append を定義するとjsonに含まれるようになる。
    protected $appends = ['street_address']; 

    // アクセサ
    // もともと定義されている
    // $this->prefecture_name 県名 
    // $this->city_name 市区町村名
    // $this->address 番地
    public function getStreetAddressAttribute($value)
    {
        return $this->prefecture_name . $this->city_name . $this->address;
    }

}

コントローラーで
$profile = App\Profile::find(1);
$street_address = $profile->street_address;
で定義した独自属性の住所が取得できる。