Laravel中如何从现金变动表获取关联项目表数据?
当然可以实现你的需求!问题出在关联关系的外键定义上,咱们一步步来修正:
1. 先修正CashMutation模型的project关联
Laravel里belongsTo关联的规则很明确:当CashMutation属于Project时,cash_mutations表中应该有一个指向projects表主键的外键(默认命名是project_id)。
你之前写的关联参数完全搞反了,正确的写法应该是这样:
class CashMutation extends Model { // ... 其他代码不变 public function project(){ // 如果你的cash_mutations表外键是默认的`project_id`,直接写这句就行 return $this->belongsTo(Project::class); // 要是你的外键字段不是默认名(比如叫`proj_id`),才需要指定第二个参数: // return $this->belongsTo(Project::class, 'proj_id'); } }
你之前把当前模型的外键写成了cash_mutation_id,这完全不符合关联逻辑,这就是预加载返回null的核心原因。
2. 修正Project模型的关联关系
既然CashMutation属于Project,那Project对应的应该是一对多(一个项目对应多条现金变动记录)或者一对一关联,而不是你写的belongsTo(这个是反向的关联逻辑)。如果是一对多,写法如下:
class Project extends Model { // ... 其他代码不变 public function cashMutations(){ return $this->hasMany(CashMutation::class); // 同样,外键非默认的话加第二个参数: // return $this->hasMany(CashMutation::class, 'proj_id'); } }
如果是一对一关系,就把hasMany换成hasOne。
3. 验证你的查询代码
关联修正后,你的查询代码就能正常工作了,另外建议用first()而不是get(),因为你查的是单条记录:
$cash_mutation = CashMutation::where('id', 4)->with('project')->first(); // 安全获取机构名称(避免null报错) $agencyName = $cash_mutation->project?->agency_name;
最后别忘了检查这两点
- 确认
cash_mutations表中存在project_id字段,并且id为4的那条记录的project_id值是projects表中存在的有效ID; - 如果你的外键字段不是默认的
project_id,一定要在关联方法里明确指定字段名。
内容的提问来源于stack exchange,提问作者frsnmk
相关产品推荐
相关产品推荐

