Laravel 5.8中hasManyThrough关联无法生效,请求技术协助
问题分析与解决
嘿,这问题我之前也踩过坑!你之所以用hasManyThrough关联失败,核心原因是参数顺序完全搞反了,咱们来一步步理清楚:
先搞懂hasManyThrough的参数规则
hasManyThrough的参数顺序是固定的,对应关系必须搞准:
return $this->hasManyThrough( 最终关联的模型类名, // 比如这里的 Product 中间模型类名, // 比如这里的 OrderProduct 中间模型中关联父模型(Order)的外键, // 也就是 order_products.order_id 最终模型的主键(对应中间模型关联它的外键), // 这里是 products.id,对应order_products.product_id 父模型(Order)的主键, // orders.id 中间模型中关联最终模型的外键 // order_products.product_id );
你的错误修正
你现在的代码里把中间模型关联Order的外键和关联Product的外键搞混了,正确的关联代码应该是:
class Order extends Model{ ... public function products() { return $this->hasManyThrough( 'App\Product', 'App\OrderProduct', 'order_id', // 中间表OrderProduct里关联Order的外键 'id', // Product的主键 'id', // Order的主键 'product_id' // 中间表OrderProduct里关联Product的外键 ); } ... }
额外建议:更适合多对多的关联方式
其实啊,Order和Product是多对多关系,Laravel里专门有belongsToMany来处理这种场景,比hasManyThrough更直观也更常用,代码会更简洁:
class Order extends Model{ ... public function products() { return $this->belongsToMany( 'App\Product', 'order_products', // 中间表名 'order_id', // 中间表中关联Order的外键 'product_id' // 中间表中关联Product的外键 ); } ... }
这种方式不仅代码更清晰,还能直接使用多对多关系的各种辅助方法(比如attach()、detach()),推荐优先用这个~
内容的提问来源于stack exchange,提问作者DanielGB
相关产品推荐
相关产品推荐

