Laravel框架user、coin、balances模型表关系及余额查询实现咨询
关联关系修正方案
1. 迁移文件优化
你当前多创建了完全冗余的coin_user中间表,balances表本身已经包含user_id和coin_id两个外键,完全可以作为用户和币种多对多关联的中间表,不需要额外的关联表,直接删除coin_user相关的迁移代码即可。
另外可选优化:balances表中的symbol字段属于冗余字段,可以直接通过关联coins表获取,避免数据不一致。
2. 模型关联修正
Balance 模型
单条余额记录仅对应一个用户、一个币种,关联方法需改为belongsTo,补充漏写的return:
class Balance extends Model { public function user() { return $this->belongsTo(User::class); } public function coin() { return $this->belongsTo(Coin::class); } }
User 模型
一个用户对应多条余额记录,同时和币种为多对多关联,中间表为balances:
class User extends Model { // 直接关联余额记录 public function balances() { return $this->hasMany(Balance::class); } // 和币种的多对多关联,读取中间表的余额字段 public function coins() { return $this->belongsToMany(Coin::class, 'balances') ->withPivot('balance', 'symbol') ->withTimestamps(); } }
Coin 模型
一个币种对应多个用户的余额记录,同时和用户为多对多关联:
class Coin extends Model { // 直接关联该币种的所有余额记录 public function balances() { return $this->hasMany(Balance::class); } // 和用户的多对多关联,读取中间表的余额字段 public function users() { return $this->belongsToMany(User::class, 'balances') ->withPivot('balance', 'symbol') ->withTimestamps(); } }
3. 余额查询方式
你原来的$coin->user->balance调用逻辑不成立,因为单个币种会对应多个用户的余额,必须先指定对应用户才能查询余额,常见查询写法如下:
- 查询当前登录用户的比特币余额(通过多对多关联)
$btc = Coin::where('symbol', 'BTC')->first(); $balance = $btc->users()->where('user_id', auth()->id())->first()?->pivot->balance;
- 查询当前登录用户的比特币余额(直接查询余额表,性能更高)
$balance = Balance::where('user_id', auth()->id()) ->where('symbol', 'BTC') ->value('balance');
- 从用户维度查询余额
$balance = auth()->user()->coins()->where('symbol', 'BTC')->first()?->pivot->balance;
内容的提问来源于stack exchange,提问作者Mojtaba Delshad
相关产品推荐
相关产品推荐

