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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:30:04