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)
}