我使用的是 Laravel 10。
我透過以下方式利用 JSON 列的轉換:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $casts = [ 'meta' => 'collection', // here ]; }
例如,當嘗試直接更新集合中的值時:
$model->meta->put('test', 100); $model->save();
沒有任何反應。
當我按原樣分配變數時,它可以正常運行。
$model->meta = ['test' => 100]; $model->save();
但是,如果我只需要更新/新增單一元素怎麼辦?
我發現了以下解決方法,但這是否是預期的行為?
$meta = $model->meta; $meta->put('test', 100); $model->meta = $meta; $model->save();
在這種情況下,似乎只有直接賦值才有效,而且強制轉換集合似乎不支援其任何寫入功能。
P粉0193532472024-03-31 00:48:23
嘗試將其轉換為集合 AsCollection
use Illuminate\Database\Eloquent\Casts\AsCollection; protected $casts = [ 'meta' => AsCollection::class, ... ];
P粉6681137682024-03-31 00:03:22
需要使用Illuminate\Database\ Eloquent\Casts\AsCollection
# 而不是 'collection'
。
在 $casts
陣列中,您可以定義各個按鍵的類型。透過指定類型的類別(必要時),Laravel 會自動處理轉換。這就是為什麼具體使用 AsCollection::class
< /a> 是必要的。
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Casts\AsCollection; class Item extends Model { protected $casts = [ 'meta' => AsCollection::class, // automatically convert value of 'meta' to Collection::class ]; }
AsCollection::class
- Laravel API 文件AsCollection
在 Laravel 8.x 或更高版本中預設可用。 如果您需要舊版本中的集合功能,則需要 自己建立自訂演員表。
或也可以使用 'array'
演員:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $casts = [ 'meta' => 'array', // automatically convert value of 'meta' to array ]; }