Laravel关联查询问题:获取含贷款类型详情的会员贷款数据
解决方法:获取包含完整贷款信息的会员数据
我来帮你一步步修改代码,实现你想要的查询结果:
问题分析
当前代码存在两个核心问题:
- 没有关联
loan_types表,所以拿不到贷款类型的详情 Loans模型没有指定可返回的字段,导致amt字段被默认排除了
接下来我们逐个解决这些问题:
第一步:完善模型的关联与字段配置
1. 更新Loans模型
我们需要给Loans添加和loanType的关联,同时指定amt字段可以被返回:
class Loans extends Model { // 允许这些字段被填充/返回,确保amt不会被过滤 protected $fillable = ['member_id', 'loan_types_id', 'amt']; // 关联会员模型 public function member() { return $this->belongsTo(Member::class); } // 添加与贷款类型模型的关联,注意外键是表中的`loan_types_id`字段 public function loanType() { return $this->belongsTo(loanType::class, 'loan_types_id'); } }
2. 确认Member模型的关联(可选优化)
如果你的业务中一个会员可能有多笔贷款,建议把hasOne改成hasMany(如果是严格一对一可以保留):
class Member extends Model { protected $fillable = [ 'name', 'address' ]; // 多笔贷款用hasMany,一对一保留hasOne public function loans() { // return $this->hasOne(Loans::class); return $this->hasMany(Loans::class); } }
第二步:修改控制器的查询逻辑
我们需要在查询时嵌套加载关联关系,同时简化JSON返回的写法(Laravel会自动处理模型到JSON的转换):
public function accountWithLoanSearch(Request $request) { $query = Member::whereHas('loans', function ($query) use ($request) { if ($request->get('memberId') != null) { $query->where('member_id', $request->get('memberId')); } }) // 同时加载loans和loans关联的loanType数据 ->with(['loans', 'loans.loanType']) ->get(); // 直接返回$query即可,Laravel会自动转为JSON,不需要手动json_encode return response()->json($query); }
第三步:调整返回结构(匹配期望结果)
你的期望结果里把loan_type和loans放在同一层级,所以我们可以用集合的map方法处理一下返回数据:
public function accountWithLoanSearch(Request $request) { $members = Member::whereHas('loans', function ($query) use ($request) { if ($request->get('memberId') != null) { $query->where('member_id', $request->get('memberId')); } }) ->with(['loans', 'loans.loanType']) ->get() ->map(function ($member) { // 把loans中的loanType提取到会员对象的顶层 $member->loan_type = $member->loans->loanType; // 移除loans里的loanType属性,让结构更简洁(可选操作) unset($member->loans['loanType']); return $member; }); return response()->json($members); }
修改后的效果
查询member_id=3时,你会得到和期望完全一致的结果:
[{
"id": 3,
"name": "n3",
"address": "a3",
"loans": {
"id": 2,
"member_id": 3,
"loan_types_id": 1,
"amt": 200
},
"loan_type": {
"id": 1,
"name": "nl1",
"interest": "1"
}
}]
内容的提问来源于stack exchange,提问作者Amrita Stha
相关产品推荐
相关产品推荐

