Laravel部署Heroku PostgreSQL报SQLSTATE[22P02 bigint错误本地正常如何解决
修复方案
错误根因
问题出在诊断结果查询的控制器逻辑:
Diagnosa::find($id)返回的是单个Diagnosa模型实例,而whereIn方法要求第二个参数为值数组- 当你直接将模型实例传给
whereIn时,Laravel会自动将模型转为属性数组,相当于把diagnosas表的所有字段值(包括浮点数类型的hasil_nilai、日期类型的diagnosa_date等)都传入了id字段的匹配列表 - 本地使用的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,代码更简洁易维护:
- 先调整模型关联命名(避免和字段名混淆,可选但推荐):
// 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'); }
- 查询逻辑简化为:
$diagnosa = Diagnosa::with(['diagnosaGejala.gejala', 'diagnosaKerusakan.kerusakan']) ->findOrFail($id) ->toArray();
内容的提问来源于stack exchange,提问作者Rhiedo Fredirico
相关产品推荐
相关产品推荐

