无中间表场景下如何为Child模型定义parents关联获取对应Parent记录
解决方案
你当前的场景属于标准一对多关联,完全不需要使用belongsToMany(该关联仅适用于需要中间表的多对多场景),直接使用hasMany关联即可实现需求:
1. 关联定义
在你的Child模型中添加parents方法:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class Child extends Model { // 其他属性、方法省略 /** * 获取当前扫描仪关联的所有扫描记录 */ public function parents(): HasMany { // 参数说明: // 第1位:目标关联模型类名 // 第2位:目标模型(Parent)对应关联的外键字段名,对应你Parent表的child_id // 第3位:当前模型(Child)的主键字段名,默认是id可省略 return $this->hasMany(Parent::class, 'child_id', 'id'); } }
如果你遵循Laravel默认的命名规范,外键命名为[关联模型小写]_id,主键为id,可以直接简化为:
public function parents(): HasMany { return $this->hasMany(Parent::class); }
注意:PHP中
parent是保留关键字,不建议直接用作模型类名,建议结合业务场景修改为ScanRecord这类更语义化的命名,避免语法冲突。
2. 调用方式
和你期望的效果完全一致:
// 获取id为1的Child对应的所有Parent记录 $child = Child::find(1); $parents = $child->parents; // 返回Parent id为1、2的两条记录
补充说明
你提到的belongsToMany适用于多对多关系,比如「一篇文章关联多个标签,一个标签关联多篇文章」,需要额外的中间表存储双向关联关系,和你当前的场景不匹配。你的补充示例里「一台扫描仪对应多条扫描记录」正是hasMany一对多关联的典型使用场景。
内容的提问来源于stack exchange,提问作者wurmi
相关产品推荐
相关产品推荐

