如何更新 Laravel Eloquent 欄位強制轉換為集合
P粉741678385
P粉741678385 2024-03-30 09:54:00
0
2
456

我使用的是 Laravel 10。

我透過以下方式利用 JSON 列的轉換:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
  protected $casts = [
    'meta' => 'collection', // here
  ];
}

例如,當嘗試直接更新集合中的值時:

$model->meta->put('test', 100);
$model->save();

沒有任何反應。

當我按原樣分配變數時,它可以正常運行。

$model->meta = ['test' => 100];
$model->save();

但是,如果我只需要更新/新增單一元素怎麼辦?

我發現了以下解決方法,但這是否是預期的行為?

$meta = $model->meta;
$meta->put('test', 100);
$model->meta = $meta;
$model->save();

在這種情況下,似乎只有直接賦值才有效,而且強制轉換集合似乎不支援其任何寫入功能。

P粉741678385
P粉741678385

全部回覆(2)
P粉019353247

嘗試將其轉換為集合 AsCollection

#
use Illuminate\Database\Eloquent\Casts\AsCollection;


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

解決方案(Laravel 8.28 或更高版本)

需要使用Illuminate\Database\ Eloquent\Casts\AsCollection# 而不是 'collection'

$casts 陣列中,您可以定義各個按鍵的類型。透過指定類型的類別(必要時),Laravel 會自動處理轉換。這就是為什麼具體使用 AsCollection::class 是必要的。

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
  ];
}
更多資訊



解決方案(Laravel 7.x 或更低版本)

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
  ];
}
更多資訊
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板