mysql - 使用 Laravel 将 JSON 转换为 MySQL 列中的数组

标签 mysql arrays json laravel-5 casting

我有一列以 JSON 格式存储在 MySQL 表中,格式为

a:3:{s:2:"12";s:0:"";s:2:"34";s:0:"";s:2:"56";s:10:"1234567890";}

但是自从 Laravel 5 中引入了 $cast 以来,我计划重新格式化我的数据和代码以与 array 转换一起使用。

没有找到直接转换的提示,所以尝试了这个:

  1. 创建了一个具有与原始列 (colA) 相同属性 (colB) 的列。
  2. 将其插入到我的模型中 protected $casts = ['colA' => 'json', 'colB' => 'array'];
  3. 执行此代码:
<小时/>
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/

相关文章:

json - 通过 Cloudformation 在 S3 存储桶上创建 SQS 事件时,通知目标服务区域对于存储桶位置约束无效

java - 格式化json日期

mysql - 使用 MySql 的 VB 登录网站

mysql - mysql 中的派生表显示错误

mysql - Play Framework 2.5 - 不使用内存数据库进行测试

c - pthread 指针数组

php - MySQL 表中不同值的计数未正确添加

c++ - 删除和移动数组 C++ 中的剩余元素

PHP 数组 stdClass 对象 - 回显值

javascript - 如何使用 javascript 或 jQuery 引用 csv 或 json 文件中的项目动态地将项目和属性添加到 HTML