Laravelにて、json型でmysqlに保存した際の取得方法(AsCollection)

Laravelにて、json型で保存した際、以下のように取得するとエンコードされた状態のjsonで取得できる。

$User = \App\Models\User::select('json')->first();
var_dump($User->json);

// 結果
[{"name":"taro"}]

1件のみ取得する場合は「json_decode」にて変換すればよいのだが、数件だとデコードするためにforeachを回して一度デコードしていく必要があり、無駄が生じる。

そこで、AsCollectionでJSON属性をLaravel Collectionインスタンスに変換することで、objectとして扱えるようにする。

LaravelのAsCollectionは、Laravel 8.x以降のバージョンで利用できる機能。Laravelのコレクションへキャストする機能を提供しており、JSON属性をLaravel Collectionインスタンスに変換が可能。

使い方として、UserモデルでのcastにAsCollectionしたいカラム名を追加する。

protected $casts = [
    'json' => AsCollection::class,
];

これにより、json型をobjectとして変換せずに扱えるようになる。


object(Illuminate\Support\Collection)#1276 (2) {
  ["items":protected]=>
  array(2) {
    ['name']=>'taro'
  ["escapeWhenCastingToString":protected]=>
  bool(false)
}