Laravel关联查询:如何通过关联表返回Field模型集合?
解决方案
嘿,这个问题其实是Laravel关联关系类型选错啦~你现在用hasMany关联到中间表的RelatedField模型,自然返回的是中间表的记录集合。要直接拿到关联的Field模型集合,我们需要用自关联的多对多关系,因为这本质上是Field和Field之间的多对多关联,related_fields就是它们的中间表。
调整关联方法
把你原来的linked()方法改成下面这样:
public function linked() { return $this->belongsToMany(Field::class, 'related_fields', 'field_id', 'related_field'); }
参数解释:
- 第一个参数:关联的目标模型类,这里是
Field自身(因为是自关联) - 第二个参数:中间表的表名
related_fields - 第三个参数:当前模型在中间表中的外键
field_id - 第四个参数:关联模型在中间表中的外键
related_field
这样调用$field->linked的时候,返回的就是你需要的Field模型集合了,Laravel会自动帮你完成关联查询,把中间表的关联ID转换成对应的Field实例。
额外优化:反向关联
如果之后需要从一个关联字段反向查询哪些字段关联了它,可以再添加一个反向关联方法:
public function linkedBy() { return $this->belongsToMany(Field::class, 'related_fields', 'related_field', 'field_id'); }
性能提示
为了避免N+1查询问题,推荐使用预加载(Eager Loading):
// 预加载所有Field的关联字段 $fields = Field::with('linked')->get();
内容的提问来源于stack exchange,提问作者Solivan
相关产品推荐
相关产品推荐

