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关联逻辑更清晰,不容易出错:
- 在
Application中定义关联到职位的方法:
public function jobOffer() { return $this->belongsTo(JobOffer::class, 'job_offer_uuid', 'uuid'); }
- 在
JobOffer中定义关联到发布者的方法:
public function publisher() { return $this->belongsTo(User::class, 'user_id'); }
- 直接通过链式调用获取发布者:
$publisher = $application->jobOffer->publisher;
内容的提问来源于stack exchange,提问作者Farid
相关产品推荐
相关产品推荐

