【问题标题】:Convert JSON to array in MySQL column using Laravel使用 Laravel 将 JSON 转换为 MySQL 列中的数组
【发布时间】:2017-04-05 05:25:10
【问题描述】:

我有一列以

的形式在 MySQL 表中存储 JSON 格式的数据
a:3:{s:2:"12";s:0:"";s:2:"34";s:0:"";s:2:"56";s:10:"1234567890";}

但自从 $cast 在 Laravel 5 中引入后,我打算重新格式化我的数据和代码以使用 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() expects parameter 1 to be string 错误,即使我dd($item->colA) 我得到了一个完美的字符串。而且,更神奇的是,如果我 dd(unserialize($item->colA)) 我得到一个完美的数组。

我虽然可能是我的数据导致了这种情况,但我尝试用一​​个只有一行的表来做这件事,但无济于事。

感谢任何提示!

【问题讨论】:

    标签: mysql arrays json laravel-5 casting


    【解决方案1】:

    如果您使用的是 $fillable$guarded,请确保 colB 已添加到 $fillable,以便您可以更新它。

    例如

    protected $fillable = [ 'colA', 'colB' ];
    

    这可能是您的第一个脚本没有更改数据库中任何内容的原因...

    另一种选择是解除模型中的所有内容...

    protected $guarded = [];
    

    【讨论】:

    • 如果你看我的代码,你会发现我没有批量更新我的行,所以 $fillable 没有效果。
    • $fillable 与批量编辑无关。这是为了保护模型免受大规模分配。至少在完全排除之前试一试。我没有看到其他人提供解决方案...
    • 正如我所说:bulk 和 mass 是同义词。我相信你甚至不知道 Laravel 中的质量赋值是什么,这是你在框架中学习的第一件事。一定想知道您的意图或专业知识...
    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 2014-01-23
    • 2020-04-16
    • 2020-03-23
    • 2017-02-15
    • 2014-08-23
    • 2018-05-30
    • 2016-12-11
    相关资源
    最近更新 更多