Rumah > Soal Jawab > teks badan
Saya menggunakan Laravel 10.
Saya memanfaatkan penukaran lajur JSON melalui:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $casts = [ 'meta' => 'collection', // here ]; }
Sebagai contoh, apabila cuba mengemas kini nilai dalam koleksi secara langsung:
$model->meta->put('test', 100); $model->save();
Tiada maklum balas.
Apabila saya menetapkan pembolehubah sebagaimana adanya, ia berfungsi dengan baik.
$model->meta = ['test' => 100]; $model->save();
Tetapi bagaimana jika saya hanya perlu mengemas kini/menambah satu elemen sahaja?
Saya menemui penyelesaian berikut, tetapi adakah ini kelakuan yang dijangkakan?
$meta = $model->meta; $meta->put('test', 100); $model->meta = $meta; $model->save();
Dalam kes ini, hanya tugasan langsung nampaknya berfungsi dan penghantaran koleksi nampaknya tidak menyokong sebarang keupayaan penulisannya.
P粉0193532472024-03-31 00:48:23
Cuba tukarkan kepada koleksi AsCollection
use Illuminate\Database\Eloquent\Casts\AsCollection; protected $casts = [ 'meta' => AsCollection::class, ... ];
P粉6681137682024-03-31 00:03:22
Memerlukan penggunaanIlluminateDatabase EloquentCastsAsCollection
而不是 'collection'
.
Dalam tatasusunan $casts
$casts
数组中,您可以定义各个键的类型。通过指定类型的类(必要时),Laravel 自动处理转换。这就是为什么具体使用 AsCollection::class
anda boleh menentukan jenis setiap kunci. Laravel secara automatik mengendalikan penukaran dengan menentukan kelas jenis (apabila perlu). Itulah sebabnya penggunaan khusus < /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
Penyelesaian (Laravel 7.x atau lebih rendah)AsCollection
Tersedia secara lalai dalam Laravel 8.x atau lebih tinggi. Jika anda memerlukan fungsi set daripada versi lama, anda perlu membuat cast tersuai sendiri
'array'
Atau anda juga boleh menggunakan
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $casts = [ 'meta' => 'array', // automatically convert value of 'meta' to array ]; }- Dokumentasi Laravel (7.x)🎜 🎜