Cara mengemas kini hantaran lajur Laravel Eloquent ke koleksi
P粉741678385
P粉741678385 2024-03-30 09:54:00
0
2
499

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粉741678385
P粉741678385

membalas semua(2)
P粉019353247

Cuba tukarkan kepada koleksi AsCollection

use Illuminate\Database\Eloquent\Casts\AsCollection;


protected $casts = [
  'meta' => AsCollection::class,
  ...
];
P粉668113768

Penyelesaian (Laravel 8.28 atau lebih tinggi)

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

diperlukan.
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
  ];
}
    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 AsCollection::class
- Dokumentasi API Laravel



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

Pelakon:
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
  protected $casts = [
    'meta' => 'array', // automatically convert value of 'meta' to array
  ];
}
    Maklumat lanjut
  • Cara melakukan transformasi tersuai
- Dokumentasi Laravel (7.x)🎜 🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan