Laravel hasManyThrough关联异常:模型匹配错误排查
排查Laravel hasManyThrough关联错误的问题
嘿,我碰到过类似的坑,这大概率是因为你没明确指定hasManyThrough的外键参数,导致Laravel用了默认命名规则,和你的实际表结构不匹配了。
先给你理清楚hasManyThrough的参数逻辑,它的四个关键参数顺序很重要:
- 目标模型(这里是
Standhouders::class) - 中间模型(这里是
Koppel_standhouders_markten::class) - 中间表中关联主模型(Markt)的外键(你的是
markt_id) - 目标表(Standhouders)中被中间表关联的键(你的是
id) - 主模型的主键(可选,默认是
id) - 中间表中关联目标模型的外键(可选,但你的情况必须指定,因为默认规则不匹配)
你的问题根源在这:Laravel默认会根据目标模型的类名生成外键——比如Standhouders模型,它会默认找中间表的standhouders_id字段,但你的中间表里是standhouder_id(单数形式),Laravel找不到匹配字段,就错误地用了中间表的id去关联Standhouders的id,这就导致关联完全跑偏了。
正确的关联写法应该是这样的,在你的Markt模型里:
public function standhouders() { return $this->hasManyThrough( Standhouders::class, Koppel_standhouders_markten::class, 'markt_id', // 中间表关联Markt的外键 'id', // Standhouders表的主键 'id', // Markt表的主键 'standhouder_id' // 中间表关联Standhouders的外键 ); }
你可以试试这个写法,然后调用Markt::find($marktId)->standhouders,应该就能正确获取到关联的摊主数据了。
另外提一句,如果模型命名能贴合Laravel的单数规范(比如把Standhouders改成Standhouder),后续默认规则会更省心,但如果已经用了复数模型名,只要明确指定外键参数就完全没问题。
内容的提问来源于stack exchange,提问作者Graham
相关产品推荐
相关产品推荐

