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

Laravel如何通过中间表使用hasOneThrough关联获取职位发布者数据

错误原因

你对hasOneThrough的参数传参规则理解有误,同时中间表job_offers使用uuid作为自定义主键而非Laravel默认的id,两个问题叠加导致生成的SQL完全不符合你的关联逻辑。

hasOneThrough的完整传参顺序如下,你之前仅传了前4个参数,触发默认规则生成了错误的关联条件:

hasOneThrough(
    目标模型类,
    中间模型类,
    中间表和当前模型关联的外键(中间表侧的字段),
    目标表和中间表关联的外键(目标表侧的字段),
    当前模型和中间表关联的外键(当前表侧的字段),
    中间表和目标表关联的外键(中间表侧的字段)
)

正确的关联写法

首先需要在JobOffer模型中声明自定义主键,否则Laravel会默认用id作为主键查询:

// JobOffer.php
protected $primaryKey = 'uuid';
// 如果你的uuid是字符串非自增ID,需要额外加下面两行
public $incrementing = false;
protected $keyType = 'string';

之后在Application模型中补全所有参数定义publisher关联:

// Application.php
public function publisher()
{
    return $this->hasOneThrough(
        User::class,
        JobOffer::class,
        'uuid', // 中间表job_offers和applications关联的字段:job_offers.uuid
        'id', // 目标表users和job_offers关联的字段:users.id
        'job_offer_uuid', // 当前表applications和job_offers关联的字段:applications.job_offer_uuid
        'user_id' // 中间表job_offers和users关联的字段:job_offers.user_id
    );
}

更简单的替代方案

你的场景不需要强行用hasOneThrough,用分层的belongsTo关联逻辑更清晰,不容易出错:

  1. 在Application中定义关联到职位的方法:
public function jobOffer()
{
    return $this->belongsTo(JobOffer::class, 'job_offer_uuid', 'uuid');
}
  1. 在JobOffer中定义关联到发布者的方法:
public function publisher()
{
    return $this->belongsTo(User::class, 'user_id');
}
  1. 直接通过链式调用获取发布者:
$publisher = $application->jobOffer->publisher;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:08