如何在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
相关产品推荐
相关产品推荐

