Laravel多对多关联查询时访问错误中间表问题排查
Laravel多对多关联默认表名来源
Laravel 中belongsToMany多对多关联的默认中间表命名遵循内置规则:将关联双方的模型名称按照字母升序排列后,以下划线拼接作为表名。
你的关联涉及User、Role两个模型,按字母排序Role首字母R排在User首字母U之前,因此框架默认生成的中间表名是role_user。
注意:你单独创建UserRole模型并在其中配置$table = "user_role"不会自动生效,只要你没有在关联定义中显式指定中间表或绑定中间表模型,框架就不会读取该模型的配置,只会走默认命名规则。
保留
user_role表名的解决方案 你可以选以下任意一种方式修改,无需调整数据库表名:
方案1:关联定义时直接指定中间表名
在两个模型的多对多关联定义中,给belongsToMany传入第二个参数显式声明中间表名:
- User模型中的关联定义修改为:
public function roles() { // 第二个参数即为自定义中间表名 return $this->belongsToMany(Role::class, 'user_role'); }
- Role模型中的关联定义同步修改为:
public function users() { return $this->belongsToMany(User::class, 'user_role'); }
方案2:绑定自定义中间表模型
如果你需要用到提前创建的UserRole中间表模型(比如需要定义中间表的额外属性、关联关系),可以通过using()方法绑定中间表模型,框架会自动读取该模型内配置的$table属性:
- User模型关联修改为:
public function roles() { return $this->belongsToMany(Role::class) ->using(UserRole::class); }
- Role模型关联修改为:
public function users() { return $this->belongsToMany(User::class) ->using(UserRole::class); }
补充说明:多对多关联返回的是关联模型的集合,建议将关联名从单数
role改为复数roles符合Laravel命名约定,测试代码对应调整为$user->roles[0]->title即可正常运行。
内容的提问来源于stack exchange,提问作者GoldyNoble
相关产品推荐
相关产品推荐

