Laravel 8 如何从现有数据库中获取一对一关联关系的数据
问题排查与解决步骤
- 首先修正关联方法调用的拼写错误:你在RfpMain模型中定义的关联方法名为
rfpDetail,但控制器中调用时写的是$rfpMain->rfpDetails,多了后缀s,Laravel关联属性调用需和方法名严格匹配,拼写错误会直接返回null。 - 手动指定关联外键和主键:Laravel的
hasOne默认会基于当前模型名自动推导外键,默认规则为「当前模型小写下划线命名 + _id」。你的主表名为request_for_payment而非rfp_main,如果rfp_details表中的关联外键不是默认推导的request_for_payment_id,必须显式指定关联参数:
// rfpmain model 修正示例,替换为你实际的数据库字段名 protected $table = 'accounting.request_for_payment'; public function rfpDetail(){ // 第一个参数为关联模型类,第二个参数为rfp_details表中的外键字段名,第三个参数为主表的关联主键字段名 return $this->hasOne(RfpDetail::class, 'rfp_main_id', 'id'); } // rfp detail model 对应补充参数 protected $table = 'accounting.rfp_details'; public function rfpMain(){ return $this->belongsTo(RfpMain::class, 'rfp_main_id', 'id'); }
- 开启SQL日志定位查询问题:你可以在控制器查询前添加代码
\DB::enableQueryLog();,调用关联后打印dd(\DB::getQueryLog());,查看实际执行的关联SQL语句,对比数据库数据即可快速确认是关联条件错误还是无匹配数据。 - 验证数据一致性:确认你查询的$id对应的
request_for_payment记录,在rfp_details表中确实存在对应关联数据,外键字段值和主表主键值一致。
修正后可用代码示例
//rfp controller public function show($id) { $rfpMain = RfpMain::findOrFail($id); // 修正属性调用名,和关联方法名匹配 $rd = $rfpMain->rfpDetail; dd($rd); }
参考数据库结构

内容的提问来源于stack exchange,提问作者Paul Iverson Cortez
相关产品推荐
相关产品推荐

