Laravel多对多关联中,是否需在两个模型都设置withPivot字段?
多对多关联获取额外字段:是否必须双向设置withPivot?
需求与背景
我需要在多对多关联中获取中间表的SCORE、HEALTH字段。
模型定义
- Channel模型:包含
title字段 - Company模型:包含
id字段
数据表结构
channels => id, title companies => id company_channel => channel_id, company_id, SCORE, HEALTH
问题
是否必须在两个模型的关联方法中都设置withPivot(['score', 'health'])?
当前代码示例
// Channel 模型 public function companies() { return $this->belongsToMany('\App\Company')->withPivot(['score', 'health']); } // Company 模型 public function channels() { return $this->belongsToMany('\App\Channel')->withPivot(['score', 'health']); }
回答
不是必须双向都设置,完全看你的业务查询场景:
- 如果你只会从Channel模型出发关联查询Company,并且需要获取中间表的score和health,那只在Channel的
companies()关联里加withPivot就够了。 - 同理,如果只会从Company模型出发关联查询Channel并需要中间表字段,只在Company的
channels()里加就行。 - 但如果两种查询场景都涉及(既查Channel下的Company带中间字段,又查Company下的Channel带中间字段),那两个模型的关联都得加
withPivot,不然缺的那一侧查询拿不到中间表的score和health。
说白了,withPivot是服务于当前这条关联查询的——你走哪条关联路径查数据,就需要那条关联里配置withPivot,才能在返回的关联模型中拿到对应的中间表字段。
内容的提问来源于stack exchange,提问作者anderlaini
相关产品推荐
相关产品推荐

