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方法替代whereRawwhereKey是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
相关产品推荐
相关产品推荐

