You need to enable JavaScript to run this app. 使用Laravel Eloquent创建数据库记录时出现Query Exception如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 04:24:03