You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel将json字段改为text类型后非数字内容无法返回如何解决

问题原因

该异常由Eloquent模型字段自动转换逻辑与数据库实际字段类型不匹配导致,和迁移执行流程无关。
Laravel Eloquent会自动识别数据表中的json类型字段,默认开启类型转换:读取字段时自动调用json_decode()将json格式字符串解析为PHP对应类型的变量/数组,写入时自动将变量转为合法json格式字符串存入数据库。
你通过迁移将数据库内history字段从json类型修改为text类型后,Eloquent的字段类型识别缓存未同步更新,或是之前手动在模型中配置的json类型转换规则未移除,仍将该字段标记为json类型执行解析逻辑:

  • 字段存储纯数字字符串(如"100")时,json_decode("100")可合法解析为整数100,因此可以正常输出
  • 字段存储非合法json格式的含非数字内容(如"100A"、"A")时,json_decode()解析失败直接返回null,因此无法读取到任何内容
解决方法
  • 若后续history字段不需要存储json格式内容,直接在DownloadHistory模型中手动覆写字段转换配置,将history指定为普通字符串类型,参考代码:
// 写在DownloadHistory模型类内部
protected $casts = [
    'history' => 'string',
    // 其余需要配置类型转换的字段可正常追加,如时间字段的datetime转换
];

配置完成后执行php artisan config:clear、php artisan cache:clear清除缓存,即可正常读取任意字符串内容。

  • 若后续仍需使用history字段存储json结构数据,字段改为text类型后,写入内容必须保证是合法json格式字符串,不可直接存入无格式的普通文本,否则解析会持续失败。
  • 字段类型迁移执行完成后,可执行php artisan model:show DownloadHistory确认模型识别到的字段类型与数据库实际类型一致,避免隐式的类型不匹配问题。

内容的提问来源于stack exchange,提问作者EduardoK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:31:10