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.
Cuba tukarkan kepada koleksi
AsCollection
Penyelesaian (Laravel 8.28 atau lebih tinggi)
Memerlukan penggunaan
IlluminateDatabase 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 khususdiperlukan.
Maklumat lanjut-
Transformasi Harta (Senarai Penukaran)- - Dokumentasi Laravel (10.x)
Penukaran Tatasusunan, Objek dan Koleksi- - Dokumentasi Laravel (10.x)
Laravel 8 menambah peralihan baharu- - Berita Laravel
- Dokumentasi API LaravelAsCollection::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 menggunakanPelakon:
Maklumat lanjut-
Cara melakukan transformasi tersuai
- Dokumentasi Laravel (7.x)🎜 🎜