Laravel 10 多对多关联查询仅返回1条数据问题求助
问题
在我的应用中,一个User可关联多个Company并拥有对应记录。我定义了如下关联方法:
User.php:
public function companies() { return $this->belongsToMany(Company::class, 'companies_users', 'company_id', 'user_id'); }
Company.php:
public function users() { return $this->belongsToMany(User::class, 'companies_users', 'company_id', 'user_id'); }
在CompanyController的store方法中,创建Company后关联当前登录用户:
public function store(StoreCompanyRequest $request) { $company = \App\Models\Company::create($request->all()); $company->users()->attach(Auth::user()->id); return redirect()->route('companies.index')->with('success','Company has been created successfully.'); }
中间表companies_users的数据更新正常,但查询或打印结果时仅能获取1条Company数据,请问哪里出现了问题?
问题原因
你把多对多关联的外键参数顺序搞反了。Laravel的belongsToMany方法中,第三和第四个参数的规则是:
- 第三个参数:当前模型对应的中间表外键名
- 第四个参数:关联目标模型对应的中间表外键名
你的关联定义里,User模型的外键顺序完全写反,导致查询关联数据时,Laravel生成的SQL匹配条件错误,只能拿到不符合预期的结果。
修正方案
1. 修正User模型的关联
User模型的companies关联中,当前模型是User,所以第三个参数应为user_id(中间表对应用户的字段),第四个参数是company_id(中间表对应公司的字段):
// User.php public function companies() { return $this->belongsToMany(Company::class, 'companies_users', 'user_id', 'company_id'); }
2. 修正Company模型的关联
Company模型的users关联参数是正确的,无需修改,保持原样即可:
// Company.php public function users() { return $this->belongsToMany(User::class, 'companies_users', 'company_id', 'user_id'); }
验证
修正之后,重新执行用户关联公司的查询(比如Auth::user()->companies),就能正确获取到所有关联的Company数据了。
内容的提问来源于stack exchange,提问作者George Dobre
相关产品推荐
相关产品推荐

