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

Laravel 8中Eager loading关联查询结果不一致异常排查

问题原因

问题根源是TransaccionWebPay模型遗漏了主键类型配置。
Laravel Eloquent 默认假设主键是自增整数类型,即便你设置了public $incrementing = false,默认的主键类型还是int,预加载关联时会自动将主键值强制转换为整数:

  • 如果主键值是数字开头的字符串,转整数后还能保留有效数值,就能匹配到关联数据
  • 如果主键值是字母/符号开头的字符串,转整数后就会变成0,这就是你看到预加载SQL出现in (0)的原因

而懒加载(先查主表再调用关联属性)时不会对主键做强制类型转换,直接用原始值查询,所以可以正常返回数据,正好匹配你提到的「预加载部分失效、懒加载全部正常」的现象。

解决方案

在TransaccionWebPay模型中补充主键类型配置即可:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class TransaccionWebPay extends Model
{
    protected $table = 'TRANSACCION_WEBPAY';
    protected $primaryKey = 'ID_TRANSACCION_WEBPAY';
    public $incrementing = false;
    // 新增下面这行,指定主键为字符串类型
    protected $keyType = 'string';

    public static function getByTokenWS($tokenws)
    {
        return TransaccionWebPay::where("TOKEN_WS", "=", $tokenws)->first();
    }

    public function detalle()
    {
        return $this->hasMany(TransaccionPresupuesto::class,"ID_TRANSACCION_WEBPAY");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:45:09