Laravel使用hasManyThrough查询用户关注城市失败如何解决
失败原因
你当前的代码失败有两个核心原因:
- 业务属于「用户-城市多对多关联」场景,
followed_cities是中间关联表,默认参数的hasManyThrough不匹配该场景的表结构 cities表的主键是自定义integer类型,未在City模型中声明主键配置,Laravel默认按bigint类型主键查询会出现类型匹配错误
解决方案
方案一(推荐):改用多对多关联 belongsToMany
该方案完全匹配你当前的多对多业务结构,代码更简洁
- 先调整
City模型的主键配置,添加如下属性:
class City extends Model { protected $primaryKey = 'id'; protected $keyType = 'int'; // 匹配表结构的integer主键类型 public $incrementing = true; // 若你的城市ID是非自增的则改为false // 其余原有代码保持不变 }
- 修改
User模型的关联方法:
public function cities() { return $this->belongsToMany(City::class, 'followed_cities'); }
- 控制器中直接查询即可:
// 写法1:直接读取当前用户关联的城市列表 $followedCities = Auth::user()->cities; // 写法2:用预加载查询(性能更优) $user = User::with('cities')->findOrFail(Auth::id()); $followedCities = $user->cities;
方案二:修正 hasManyThrough 关联参数
如果你坚持要使用 hasManyThrough,需要手动指定所有外键参数匹配你的表结构:
- 同样先完成上面方案一中的
City模型主键配置 - 修改
User模型的cities关联方法:
public function cities() { return $this->hasManyThrough( City::class, FollowedCity::class, 'user_id', // 中间表followed_cities关联users表的外键 'id', // cities表的主键字段名 'id', // users表的主键字段名 'city_id' // 中间表followed_cities关联cities表的外键 ); }
- 控制器原有查询代码可直接使用,执行后通过
$followedCities->cities即可获取城市列表
额外注意事项
- 确保你已经创建了
FollowedCity中间表对应的模型类 - 若不需要获取用户其他信息,直接用
Auth::user()->cities即可,无需重复查询用户数据
内容的提问来源于stack exchange,提问作者Djozeph
相关产品推荐
相关产品推荐

