Laravel 8批量更新多行同值时request值存入异常问题排查
问题原因与解决办法:数据库更新联系电话变为2147483647
问题原因
你看到的2147483647是MySQL中INT类型的最大值。当尝试向INT类型字段写入超出其存储范围的数值时,MySQL会自动将数值截断为这个最大值。虽然你提到输入的是8917772,但实际场景中大概率是输入的号码长度超过了INT的上限(INT最多存储10位纯数字,最大值为2147483647),或者你的contactno字段类型设置错误,导致无法正确存储目标号码。
解决办法
1. 修改数据库字段类型(核心修复)
联系电话无需作为数值进行计算,还可能包含区号、+号等非数字字符,优先推荐将contactno字段从INT改为VARCHAR(20)。如果坚持使用数值类型,可改为BIGINT(支持存储最多19位纯数字)。
以MySQL为例,执行以下SQL命令修改字段:
-- 改为VARCHAR类型(推荐) ALTER TABLE details MODIFY COLUMN contactno VARCHAR(20) NOT NULL; -- 或改为BIGINT类型(仅适用于纯数字号码) ALTER TABLE details MODIFY COLUMN contactno BIGINT NOT NULL;
2. 代码层面优化(可选)
- 添加请求参数验证,确保输入格式合法:
public function updateno(Request $request){ if(Auth::id()){ // 根据字段类型添加验证规则 $request->validate([ 'contactno' => 'required|string|max:20' // 对应VARCHAR类型 // 若用BIGINT,可改为 'required|numeric|digits_between:7,19' ]); $user_id = Auth::id(); details::where('user_id', $user_id) ->where('order','pending') ->update(['contactno' => $request->contactno]); return redirect()->back(); }else{ return redirect('/login'); } }
- 匹配模型字段类型:如果使用Eloquent模型,检查
details模型的$casts属性,确保contactno的类型与数据库字段一致(比如VARCHAR对应string,BIGINT对应integer)。
内容的提问来源于stack exchange,提问作者Nubie
相关产品推荐
相关产品推荐

