Laravel Eloquent关联:如何关联banks表完善提现列表数据?
Laravel Eloquent关联banks表的解决方案
咱们先聊第一个问题:银行详情完全适合包含在get_user数组中。从业务逻辑来看,银行信息是和用户的 trainer 收款信息绑定的,属于用户的附属属性,放在get_user下能让数据结构更清晰,符合关联关系的层级,前端处理起来也更直观。
接下来给你两种实现关联banks表的方式,你可以根据自己的场景选择:
方式一:用Eloquent嵌套关联(推荐,更符合Laravel最佳实践)
这种方式通过定义模型间的关联关系,让代码更易维护,后续还能复用这些关联。
- 先在User模型中定义与TrainerDetail的关联
// User.php public function trainerDetail() { return $this->hasOne(TrainerDetail::class, 'user_id', 'id'); }
- 在TrainerDetail模型中定义与Bank的关联
// TrainerDetail.php public function bank() { return $this->belongsTo(Bank::class, 'default_bank_id', 'id'); }
- 修改Withdraw模型的getWithDrawList方法,嵌套加载关联
class Withdraw extends Model { public function getUser() { return $this->belongsTo(User::class, 'user_id', 'id'); } public function getStatus() { return $this->belongsTo(WithdrawStatus::class, 'status_id', 'id'); } public static function getWithDrawList() { $data = Withdraw::with([ 'getUser' => function ($q) { // 嵌套加载trainerDetail以及关联的bank信息 $q->with('trainerDetail.bank'); }, 'getStatus' ])->get()->toArray(); return $data; } }
这样返回的get_user数组里会包含trainer_detail字段,其中又嵌套了bank的完整信息,结构非常清晰。
方式二:直接在查询中join banks表(适合简单场景,快速实现)
如果不想额外定义模型关联,也可以直接在当前的join语句中关联banks表,把银行字段选出来:
class Withdraw extends Model { public function getUser() { return $this->belongsTo(User::class, 'user_id', 'id'); } public function getStatus() { return $this->belongsTo(WithdrawStatus::class, 'status_id', 'id'); } public static function getWithDrawList() { $data = Withdraw::with(['getUser' => function ($q) { $q->select( 'users.*', 'trainer_details.default_acc_name', 'trainer_details.default_acc_number', 'banks.id as bank_id', 'banks.name as bank_name' ) ->join('trainer_details', 'users.id', '=', 'trainer_details.user_id') // 用leftJoin避免没有绑定银行的记录被过滤掉 ->leftJoin('banks', 'trainer_details.default_bank_id', '=', 'banks.id'); }]) ->with(['getStatus']) ->get() ->toArray(); return $data; } }
这种方式会把银行的id和name直接放到get_user数组里,无需嵌套层级,适合只需要一次性获取这些字段的场景。
内容的提问来源于stack exchange,提问作者MMMM
相关产品推荐
相关产品推荐

