我有一列以 JSON 格式存储在 MySQL 表中,格式为
a:3:{s:2:"12";s:0:"";s:2:"34";s:0:"";s:2:"56";s:10:"1234567890";}
但是自从 Laravel 5 中引入了 $cast
以来,我计划重新格式化我的数据和代码以与 array 转换一起使用。
没有找到直接转换的提示,所以尝试了这个:
- 创建了一个具有与原始列 (colA) 相同属性 (colB) 的列。
- 将其插入到我的模型中
protected $casts = ['colA' => 'json', 'colB' => 'array'];
- 执行此代码:
foreach(Model::all() as $item){
$item->colB = $item->colA;
$item->save();
}
代码执行时没有错误,但什么也没发生。 colB 是空的。 不过,也许 Laravel 不喜欢我的 JSON 格式,所以我将代码更改为:
foreach(Model::all() as $item){
$item->colB = unserialize($item->colA);
$item->save();
}
和protected $casts = ['colB' => 'array'];
但是我得到了 unserialize() Expectsparameter 1 to be string
错误,即使我 dd($item->colA)
我得到了一个完美的字符串。而且,更令人惊奇的是,如果我 dd(unserialize($item->colA))
我会得到一个完美的数组。
我虽然可能是我的数据导致了这种情况,并尝试使用具有单行的表来执行此操作,但无济于事。
任何提示表示赞赏!
最佳答案
如果您使用的是 $fillable
和 $guarded
,请确保 colB 已添加到 $fillable
中,以便您可以更新它。
例如
protected $fillable = [ 'colA', 'colB' ];
可能是您的第一个脚本没有更改数据库中任何内容的原因......
另一种选择是取消模型中所有内容的保护...
protected $guarded = [];
关于mysql - 使用 Laravel 将 JSON 转换为 MySQL 列中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40726569/