You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无中间表场景下如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 06:24:02