Laravel:如何在嵌套关联中提取对象?已解决
Laravel 关联查询优化:直接获取多对多关联模型数据
我完全懂你现在的困扰——用嵌套的hasMany+hasOne查询时,结果里带着中间表的冗余字段,而你只想直接拿到关联的class_of_pesson数据列表对吧?
问题根源
你之前的关联设计是把中间表classes_of_person当成了独立模型,用Persons hasMany ClassesOfPersons再关联ClassesOfPersons hasOne classe_of_pesson,这种嵌套查询自然会返回中间表的结构,包含person_id、class_id这些你不需要的字段。
最优解决方案:使用belongsToMany多对多关联
其实你的数据表结构就是标准的多对多关系:persons和class_of_pesson通过中间表classes_of_person关联,直接用Laravel的belongsToMany就能一步到位得到你想要的结果。
修改Persons模型的关联定义:
// Persons模型 public function classes_of_person() { // 参数依次是:关联模型类、中间表名、当前模型外键、关联模型外键 return $this->belongsToMany(ClasseOfPesson::class, 'classes_of_person', 'person_id', 'class_of_person_id'); }
如果你遵循Laravel的命名规范(比如中间表名是单数模型名按字母顺序拼接),其实可以省略后面的参数,但明确写出字段名会更清晰,避免因命名差异导致的问题。
然后执行查询:
Persons::with('classes_of_person')->paginate(10);
返回的结果就会完全符合你的期望:
data: [ { "id": 1, "name": "john", "classes_of_person": [{"id": 1, "desc": "employee"}] } ]
关于你尝试的pluck方法补充
如果暂时不想修改关联,也可以在查询后对集合手动处理,但这种方式不如用belongsToMany优雅高效:
$persons = Persons::with('classes_of_person.class_of_pesson')->paginate(10); $persons->getCollection()->transform(function ($person) { $person->classes_of_person = $person->classes_of_person->pluck('class_of_pesson'); return $person; });
不过显然,直接用正确的多对多关联是更优的选择,既减少了冗余查询,也让代码更符合Laravel的设计思想。
内容的提问来源于stack exchange,提问作者Rafael L R
相关产品推荐
相关产品推荐

