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

Laravel使用hasManyThrough查询用户关注城市失败如何解决

失败原因

你当前的代码失败有两个核心原因:

  1. 业务属于「用户-城市多对多关联」场景,followed_cities 是中间关联表,默认参数的 hasManyThrough 不匹配该场景的表结构
  2. cities 表的主键是自定义 integer 类型,未在 City 模型中声明主键配置,Laravel默认按 bigint 类型主键查询会出现类型匹配错误

解决方案

方案一(推荐):改用多对多关联 belongsToMany

该方案完全匹配你当前的多对多业务结构,代码更简洁

  1. 先调整 City 模型的主键配置,添加如下属性:
class City extends Model
{
    protected $primaryKey = 'id';
    protected $keyType = 'int'; // 匹配表结构的integer主键类型
    public $incrementing = true; // 若你的城市ID是非自增的则改为false
    // 其余原有代码保持不变
}
  1. 修改 User 模型的关联方法:
public function cities()
{
    return $this->belongsToMany(City::class, 'followed_cities');
}
  1. 控制器中直接查询即可:
// 写法1:直接读取当前用户关联的城市列表
$followedCities = Auth::user()->cities;

// 写法2:用预加载查询(性能更优)
$user = User::with('cities')->findOrFail(Auth::id());
$followedCities = $user->cities;

方案二:修正 hasManyThrough 关联参数

如果你坚持要使用 hasManyThrough,需要手动指定所有外键参数匹配你的表结构:

  1. 同样先完成上面方案一中的 City 模型主键配置
  2. 修改 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表的外键
    );
}
  1. 控制器原有查询代码可直接使用,执行后通过 $followedCities->cities 即可获取城市列表

额外注意事项

  • 确保你已经创建了 FollowedCity 中间表对应的模型类
  • 若不需要获取用户其他信息,直接用 Auth::user()->cities 即可,无需重复查询用户数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:18:02