Laravel 8.x BelongsToMany多对多关联查询返回空结果问题
Laravel 8.x 多对多关联查询返回空结果问题定位
问题背景
项目基于Laravel 8.x开发,共3张业务表:
Shops表:字段为shop_id、company_id、name、latitude、logntitude、phonepackages表:字段为package_id、company_id、cost、value、expire_dateshop_packages中间表:字段为package_id、shop_id
业务需求为查询指定套餐关联的门店数据,原有模型关联定义如下:
Package模型关联代码
public function shop():BelongsToMany{ return $this->belongsToMany(Shop::class,'shop_packages','package_id','package_id'); }
Shop模型关联代码
public function package(){ return $this->belongsToMany(Package::class,'shop_packages','shop_id','shop_id'); }
执行查询代码:
Package::with('shop')->where('package_id',$request['package_id'])->first();
现象:shop_packages中间表已存在对应关联数据,但返回结果中shop关联始终为空。
问题根因
belongsToMany多对多关联方法的参数传递错误,该方法的核心参数规则为:
belongsToMany(关联模型类, 中间表名, 当前模型在中间表的外键, 关联模型在中间表的外键)
原有代码存在两处核心参数错误:
- Package模型关联Shop时,第四个参数(关联模型在中间表的外键)错误传入
package_id,实际应为Shop模型在中间表对应的外键shop_id,导致ORM生成的关联查询SQL会拿中间表的package_id值去匹配Shops表的主键,无法匹配到正确数据。 - Shop模型关联Package时,第四个参数错误传入
shop_id,实际应为Package模型在中间表对应的外键package_id,关联逻辑完全错误。
额外优化点:多对多关联因为单个模型对应多个关联结果,关联方法名建议使用复数形式,符合语义规范,该点不影响查询结果正确性。
修复方案
修正模型关联定义
Package模型
// 方法名调整为复数shops,匹配一对多语义 public function shops():BelongsToMany{ // 第四个参数修正为关联Shop模型在中间表的外键shop_id return $this->belongsToMany(Shop::class,'shop_packages','package_id','shop_id'); }
Shop模型
// 方法名调整为复数packages,匹配一对多语义 public function packages():BelongsToMany{ // 第四个参数修正为关联Package模型在中间表的外键package_id return $this->belongsToMany(Package::class,'shop_packages','shop_id','package_id'); }
修正查询代码
// 关联预加载名对应调整为shops Package::with('shops')->where('package_id',$request['package_id'])->first();
修正后即可正常查询到关联的门店数据。
内容的提问来源于stack exchange,提问作者stackoverflow account
相关产品推荐
相关产品推荐

