Heim > Fragen und Antworten > Hauptteil
Ich verwende Laravel 10.
Ich nutze die Konvertierung von JSON-Spalten über:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $casts = [ 'meta' => 'collection', // here ]; }
Zum Beispiel, wenn Sie versuchen, einen Wert in einer Sammlung direkt zu aktualisieren:
$model->meta->put('test', 100); $model->save();
Keine Antwort.
Wenn ich die Variable so zuweise, wie sie ist, funktioniert es einwandfrei.
$model->meta = ['test' => 100]; $model->save();
Aber was ist, wenn ich nur ein einzelnes Element aktualisieren/hinzufügen muss?
Ich habe die folgende Problemumgehung gefunden, aber ist das das erwartete Verhalten?
$meta = $model->meta; $meta->put('test', 100); $model->meta = $meta; $model->save();
In diesem Fall scheint nur die direkte Zuweisung zu funktionieren, und das Casting der Sammlung scheint keine ihrer Schreibfunktionen zu unterstützen.
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 ]; }