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 列:数组到字符串的转换的主要内容,如果未能解决你的问题,请参考以下文章