使用Laravel Eloquent创建数据库记录时出现Query Exception如何解决?
常见原因及排查方案
1. 计算结果为非法浮点值
这是最高发的原因:第二次迭代计算$balance_after_transaction时出现了NaN(非数字)、INF(无穷大) 这类PHP支持但MySQL不接受的浮点类型值。通常是计算过程中出现了除以0、对负数开方、非法数值参与运算等逻辑导致。
你可以在插入代码前加一行调试代码验证:
var_dump($balance_after_transaction); // 或者增加非法值判断逻辑 if (is_nan($balance_after_transaction) || is_infinite($balance_after_transaction)) { dd('出现非法浮点值', $balance_after_transaction); }
2. 数据库字段约束不匹配
- 如果数据库
balance字段设置为unsigned无符号类型,第一次计算的结果为正可正常插入,第二次计算结果为负时就会触发约束报错 - 如果用的是
decimal定点类型,且设置的精度不足,比如字段定义为decimal(8,2),但计算结果的整数部分超过6位,就会触发长度溢出报错
你可以核对数据库表transactions的balance字段定义,和第二次迭代时的$balance_after_transaction值对比是否符合约束。
3. 变量未正确重置/赋值异常
检查循环逻辑中$balance_after_transaction的赋值逻辑,是否存在第一次计算后,第二次迭代时依赖的前置变量(比如上一笔余额、本次交易金额)未正确取值,导致$balance_after_transaction被赋值为null、字符串等非预期类型。
快速定位方法
捕获QueryException的完整信息,直接查看实际执行的SQL和绑定参数:
try { Transaction::firstOrCreate([ 'date' => $date, 'transaction_type' => $the_big_array[$i][2], 'db_counter_party_id' => $db_counter_party_id, 'amount' => $amount, 'currency' => $the_big_array[$i][6], 'usage' => $the_big_array[$i][7], 'category' => "none", 'balance' => $balance_after_transaction, ]); } catch (\Illuminate\Database\QueryException $e) { dd($e->getSql(), $e->getBindings()); }
打印出的绑定参数里可以直接看到balance对应传入的值是什么,就能快速定位问题。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

