Laravel 雄辩不更新 JSON 列:数组到字符串的转换

Posted

技术标签:

【中文标题】Laravel 雄辩不更新 JSON 列:数组到字符串的转换【英文标题】:Laravel eloquent does not update JSON column : Array to string conversion 【发布时间】: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 项目中进行更新,但我不知道这个问题针对的是哪个版本。 【参考方案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 的强制转换功能。谢谢你的回答

以上是关于Laravel 雄辩不更新 JSON 列:数组到字符串的转换的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 雄辩到 json

Laravel:如何设置带有条件的自定义列?

雄辩的 orm - 放置一个数组

在laravel中以雄辩的关系获取错误列的数据

Laravel 雄辩的 all() 方法给出错误“数组到字符串的转换”[关闭]

用于 maria-db 动态列的 Laravel 雄辩包装器