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;
で定義した独自属性の住所が取得できる。