【问题标题】:Laravel eloquent does not update JSON column : Array to string conversionLaravel 雄辩不更新 JSON 列:数组到字符串的转换
【发布时间】:2018-01-03 20:04:59
【问题描述】:

我想更新我数据库中的 JSON 列,但我收到此错误:

Array to string conversion  

我已在模型中将列名声明为array

protected $casts = [
    'destinations' => 'array'
];

这是我使用的代码:

$data[] = [
    'from' => $fromArray,
    'to' => $toArray
];

Flight::where('id', $id)->update(['destinations' => $data]);

我该怎么办?

【问题讨论】:

  • 试试这个:$flight = Flight::find($id); $flight->destinations = $data; $flight->save();here
  • @Maraboc 请发布您的答案
  • 我刚刚意识到需要在问题中添加 laravel 版本标签。我需要在我的 laravel 项目中进行更新,但我不知道这个问题针对的是哪个版本。

标签: php mysql json laravel eloquent


【解决方案1】:

您可以使用箭头访问您的 json 键,这样您就可以像这样更新您的列:

Flight::where('id', $id)->update([
   'destinations->from' => $data['from'],
   'destinations->to'  => $data['to']
]);

正如@fubar 所说,您必须拥有mysql 5.7 才能使我的解决方案起作用。

查看docs

【讨论】:

  • 并非所有数据库都支持。例如,MySQL 5.7+。
【解决方案2】:

这段代码为我完成了工作。

$user = User::where('id', $request->user_id)
        ->first();

$array_data = ["json_key3"=>"value"];

$user->forceFill([
    'db_column->json_key1->json_key2' => $array_data
])->save();

【讨论】:

    【解决方案3】:

    根据 Github 上的这个对话:Make json attributes fillable if Model field is fillableTaylor Otwell 推荐使用save 方法:

    $model->options = ['foo' => 'bar'];

    $model->save();

    所以在你的情况下,你可以这样做:

    $flight = Flight::find($id); 
    $flight->destinations = $data; 
    $flight->save();
    

    【讨论】:

    • 为什么这又是一个公认的答案?这与数据库 JSON 类型列和适当的 JSON_SET 方法无关!
    【解决方案4】:

    您收到该错误是因为您尝试使用查询构建器更新您的模型,该构建器基本上只是创建原始 SQL 查询。它不知道模型中定义的任何数据转换等。因此,您有三个选择:

    1) 找到您的模型,然后在您的模型实例上运行更新。

    $flight = Flight::findOrFail($id);
    $flight->update(['destinations' => $data]);
    

    2) 更新前将数据转换为字符串。

    $data = json_encode($data);
    Flight::where('id', $id)->update(['destinations' => $data]);
    

    3) 根据@AmrAly 的建议,使用支持 JSON 列查询的数据库。请注意此选项,因为并非所有数据库都支持 JSON 列。

    【讨论】:

    • 我知道可以使用 json_encode 来完成,但我想使用 eloquent 的强制转换功能。谢谢你的回答
    猜你喜欢
    • 2016-05-08
    • 2022-01-24
    • 2020-05-30
    • 2019-05-31
    • 2021-06-01
    • 2016-02-09
    • 2020-02-14
    • 2016-06-09
    • 2019-10-01
    相关资源
    最近更新 更多