Laravel操作SQL Server报错nvarchar转int类型失败如何解决?
问题根源
- 类型不匹配:你的数据库
data字段定义为INT类型,但控制器中将表单提交的data数组直接执行json_encode转成了JSON字符串(比如你提交两个1就会得到["1","1"]),将字符串存入INT字段时SQL Server无法完成类型转换,直接触发报错。 - 插入逻辑不符合需求:你当前代码仅执行了一次
Data::create操作,只会生成1条数据,完全不符合插入2条数据的需求。
修复方案
只需修改DataController.php中的store方法即可,无需调整其他现有业务结构:
方案1:单条循环插入(逻辑简单,适合小数据量场景)
public function store(StoreDataPost $request) { // 遍历提交的data数组,逐个插入生成多条记录 foreach ($request->get('data') as $item) { Data::create([ 'data' => intval($item) // 转成int类型匹配数据库字段 ]); } // 后续补充你需要的返回逻辑即可 }
方案2:批量插入(性能更高,仅需1次SQL查询)
public function store(StoreDataPost $request) { $insertData = array_map(fn($val) => ['data' => intval($val)], $request->get('data')); Data::insert($insertData); }
额外注意点
你当前Data模型中定义的getDataAttribute访问器会在读取data字段时自动执行json_decode,但你存入的是INT类型的值,json_decode解析INT会返回null。如果该访问器是其他业务逻辑必备的,可调整为兼容模式:
public function getDataAttribute($value) { $json = json_decode($value); return json_last_error() === JSON_ERROR_NONE ? $json : $value; }
如果该访问器无其他用途可以直接删除,避免后续读取字段时得到异常值。
内容的提问来源于stack exchange,提问作者El conde Lucanor
相关产品推荐
相关产品推荐

