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

Laravel 10 Eloquent Morph字段类型不匹配错误(PostgreSQL)求助

问题描述

使用PostgreSQL 17.2,transactions表包含多态关联字段entity_type和entity_id。调用whereHasMorph方法时,因users表的id为bigint类型,而entity_id是字符串类型,出现类型不匹配错误。

代码示例

$query->whereHas('user', function (Builder $query) use ($dto) {
    $query->whereRaw("id = ?", [$dto->sender])
          ->orWhereRaw("username = ?", [$dto->sender]);
});
$query->whereHasMorph('entity', [EntityTypeEnum::USER->value], function (Builder $query) use ($userId) {
    $query->whereRaw("id = ?", [$userId]);
});
return;

错误输出

SQLSTATE[42883]: Undefined function: 7 ERROR:  operator does not exist: character varying = bigint
      LINE 1: ...users" where "payment"."transactions"."entity_id" = "account...
                                                                   ^
      HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
解决方案

以下是无需原生SQL的修复方式:

  • 在User模型中指定主键类型
    在User模型里设置$keyType为'string',让Laravel自动处理类型转换:

    class User extends Model
    {
        protected $keyType = 'string';
        // 其他模型代码
    }
    

    这样Laravel构建关联查询时,会自动将id转换为字符串类型,匹配entity_id的字段类型。

  • 使用whereKey方法替代whereRaw
    whereKey是Laravel专门用于匹配主键的方法,会自动处理主键类型转换:

    $query->whereHasMorph('entity', [EntityTypeEnum::USER->value], function (Builder $query) use ($userId) {
        $query->whereKey($userId);
    });
    
  • 调整多态关联字段类型(允许改表时用)
    将transactions表的entity_id字段类型改为bigint,和users.id保持一致,从根源解决类型不匹配问题。

  • 手动转换参数类型配合查询构建器
    查询时将$userId转为字符串,用Laravel原生where方法:

    $query->whereHasMorph('entity', [EntityTypeEnum::USER->value], function (Builder $query) use ($userId) {
        $query->where('id', (string)$userId);
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:44:57