cari

Rumah  >  Soal Jawab  >  teks badan

Cara mengemas kini hantaran lajur Laravel Eloquent ke koleksi

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粉741678385P粉741678385296 hari yang lalu524

membalas semua(2)saya akan balas

  • P粉019353247

    P粉0193532472024-03-31 00:48:23

    Cuba tukarkan kepada koleksi AsCollection

    use Illuminate\Database\Eloquent\Casts\AsCollection;
    
    
    protected $casts = [
      'meta' => AsCollection::class,
      ...
    ];
    

    balas
    0
  • P粉668113768

    P粉6681137682024-03-31 00:03:22

    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 < /a>

    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
      ];
    }
    
    - 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)🎜 🎜

    balas
    0
  • Batalbalas