Laravel中使用json_encode/decode给JSON字段追加数据时数组变整数问题
问题原因
问题出在array_push的返回值特性上:array_push函数返回的是追加元素后数组的总长度,而非修改后的数组本身。你把这个返回值(整数2)赋值给了$file_history,最后通过json_encode转换后,自然就变成了字符串"2"存入数据库。
修复方案
方案1:正确使用array_push
不要将array_push的返回值赋值给原变量,直接调用函数修改数组:
public function update(Request $request, String $uuid) { $file = File::find($uuid); $json_data = [ "updated_at" => Carbon::now() ]; $file_history = json_decode($file->file_history, true); // 直接调用array_push,不接收返回值 array_push($file_history, $json_data); $file->file_history = json_encode($file_history); // 优先保存手动修改的字段,避免request数据覆盖 $file->save(); return $file; }
方案2:使用PHP数组追加语法(更简洁)
直接用[]语法向数组末尾追加元素,可读性更强:
public function update(Request $request, String $uuid) { $file = File::find($uuid); $file_history = json_decode($file->file_history, true); // 直接追加元素到数组 $file_history[] = [ "updated_at" => Carbon::now() ]; $file->file_history = json_encode($file_history); $file->save(); return $file; }
进阶优化:利用Laravel的字段自动转换
在File模型中配置$casts属性,让Laravel自动处理JSON与数组的转换,无需手动调用json_decode和json_encode:
class File extends Model { protected $casts = [ 'file_history' => 'array', ]; }
之后代码可以简化为:
public function update(Request $request, String $uuid) { $file = File::find($uuid); // 直接操作数组,Laravel会自动转为JSON存入数据库 $file->file_history[] = [ "updated_at" => Carbon::now() ]; $file->update($request->all()); return $file; }
内容的提问来源于stack exchange,提问作者Lilian Carion
相关产品推荐
相关产品推荐

