Laravel外键关联异常:无法获取指定用户的关联反馈
问题原因
你的问题出在User模型的主键配置不完整:
你已经设置了protected $primaryKey = 'username';,但Laravel默认主键是自增整数类型,会自动将主键值当作整数处理。当你用User::find($username)查询时,字符串类型的username会被强制转换为整数0,导致关联查询feedback表时使用username = 0作为条件。而MySQL中字符串与整数比较时,非数字开头的字符串会被转为0,所以所有username非空的反馈记录都会被匹配出来,最终返回所有反馈。
修复方案
在User模型中补充两个关键配置,明确告知Laravel主键的类型和非自增特性:
class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // 已有的代码... protected $primaryKey = 'username'; // 添加以下两行配置 public $incrementing = false; // 关闭主键自增特性 protected $keyType = 'string'; // 指定主键为字符串类型 // 已有的代码... public function feedbacks() { return $this->hasMany(Feedback::class, 'username'); } }
同时,为确保关联逻辑严谨,建议完善Feedback模型的user关联方法,明确指定外键:
class Feedback extends Model { use HasFactory; public function user() { // 明确指定外键为username,对应User模型的主键字段 return $this->belongsTo(User::class, 'username'); } }
验证修复
修改后重新执行查询,Laravel生成的SQL会正确替换为目标用户的username值,例如:
select * from `feedback` where `feedback`.`username` = 'nerigupex' and `feedback`.`username` is not null
此时就能正确返回该用户的关联反馈记录。
内容的提问来源于stack exchange,提问作者Pasindu Ruwandeniya
相关产品推荐
相关产品推荐

