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

如何在Laravel 9/10中实现belongsToThrough关联关系?

解决方案

要实现 Worker::find(1)->employer->company_name 的调用,你可以利用 Laravel 内置的 hasOneThrough 关联方法——Laravel 原生没有提供 belongsToThrough,但通过调整 hasOneThrough 的参数可以满足你的需求。

步骤 1:补充 Worker 模型的基础关联

首先在 Worker 模型中添加与 Instance 的一对多关联(一个 Worker 可对应多个 Instance):

class Worker extends Model
{
    public function instances()
    {
        return $this->hasMany(Instance::class);
    }
}

步骤 2:实现 Employer 关联

接着在 Worker 模型中定义 employer 关联,通过 hasOneThrough 指定正确的外键映射:

public function employer()
{
    return $this->hasOneThrough(
        Employer::class,        // 最终要关联的目标模型
        Instance::class,        // 中间关联模型
        'worker_id',            // Instance 表中关联 Worker 的外键
        'id',                   // Employer 表的主键
        'id',                   // Worker 表的主键
        'employer_id'           // Instance 表中关联 Employer 的外键
    );
}

验证调用

现在你可以直接使用预期的调用方式:

$workers_company = Worker::find(1)->employer->company_name;

生成的 SQL 说明

该关联会生成符合需求的查询语句:

select `employers`.* 
from `employers` 
inner join `instances` on `instances`.`employer_id` = `employers`.`id` 
where `instances`.`worker_id` = ?

注意事项

  • 如果一个 Worker 对应多个 Employer(多条 Instance 记录),hasOneThrough 会返回第一条匹配的 Employer。若需限制一个 Worker 只能绑定一个 Employer,建议在数据库 instances 表的 worker_id 字段添加唯一约束。
  • 该关联支持 Laravel 预加载(Eager Loading),例如 Worker::with('employer')->get();,可避免 N+1 查询问题。

内容的提问来源于stack exchange,提问作者JanBoehmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:45:02