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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:33:10