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

Laravel部署Heroku PostgreSQL报SQLSTATE[22P02 bigint错误本地正常如何解决

修复方案

错误根因

问题出在诊断结果查询的控制器逻辑:

  1. Diagnosa::find($id) 返回的是单个Diagnosa模型实例,而whereIn方法要求第二个参数为值数组
  2. 当你直接将模型实例传给whereIn时,Laravel会自动将模型转为属性数组,相当于把diagnosas表的所有字段值(包括浮点数类型的hasil_nilai、日期类型的diagnosa_date等)都传入了id字段的匹配列表
  3. 本地使用的MySQL对类型校验宽松,会自动做隐式类型转换,因此不会报错;而Heroku使用的PostgreSQL是强类型数据库,要求bigint类型的id字段匹配值必须为整数,因此抛出类型错误。

直接修复代码

将原有查询逻辑替换为以下代码即可解决报错:

$diagnosa = Diagnosa::where('diagnosas.id', $id)
    ->join('diagnosa_gejalas', 'diagnosa_gejala_id', '=', 'diagnosas.id')
    ->join('diagnosa_kerusakans', 'diagnosa_kerusakan_id', '=', 'diagnosas.id')
    ->join('gejalas', 'gejala_id', '=', 'gejalas.id')
    ->join('kerusakans', 'kerusakan_id', '=', 'kerusakans.id')
    ->get()
    ->toArray();

原代码中的$getId = Diagnosa::find($id)属于冗余查询,直接删除即可。

更优写法(推荐)

你已经在模型中定义好了关联关系,可直接使用Laravel的预加载功能替代手动写join,代码更简洁易维护:

  1. 先调整模型关联命名(避免和字段名混淆,可选但推荐):
// DiagnosaGejala 模型修改为
public function diagnosa() {
    return $this->belongsTo(Diagnosa::class, 'diagnosa_gejala_id');
}
public function gejala() {
    return $this->belongsTo(Gejala::class, 'gejala_id');
}

// DiagnosaKerusakan 模型修改为
public function diagnosa() {
    return $this->belongsTo(Diagnosa::class, 'diagnosa_kerusakan_id');
}
public function kerusakan() {
    return $this->belongsTo(Kerusakan::class, 'kerusakan_id');
}
  1. 查询逻辑简化为:
$diagnosa = Diagnosa::with(['diagnosaGejala.gejala', 'diagnosaKerusakan.kerusakan'])
    ->findOrFail($id)
    ->toArray();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:15:03