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

Laravel Eloquent关联:如何关联banks表完善提现列表数据?

Laravel Eloquent关联banks表的解决方案

咱们先聊第一个问题:银行详情完全适合包含在get_user数组中。从业务逻辑来看,银行信息是和用户的 trainer 收款信息绑定的,属于用户的附属属性,放在get_user下能让数据结构更清晰,符合关联关系的层级,前端处理起来也更直观。

接下来给你两种实现关联banks表的方式,你可以根据自己的场景选择:

方式一:用Eloquent嵌套关联(推荐,更符合Laravel最佳实践)

这种方式通过定义模型间的关联关系,让代码更易维护,后续还能复用这些关联。

  1. 先在User模型中定义与TrainerDetail的关联
// User.php
public function trainerDetail()
{
    return $this->hasOne(TrainerDetail::class, 'user_id', 'id');
}
  1. 在TrainerDetail模型中定义与Bank的关联
// TrainerDetail.php
public function bank()
{
    return $this->belongsTo(Bank::class, 'default_bank_id', 'id');
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:32:51