Laravel关联查询报错Unknown column 'coin_user.symbol'解决方案咨询
报错原因
- 关联用错了中间表:你定义多对多关联时默认用了
coin_user作为中间表,但这张表只有user_id和coin_id两个字段,不存在你在withPivot里指定的symbol、balance字段,触发字段不存在报错。 - 余额字段实际存储在
balances表中,你当前的关联定义完全没有用到这张表,反而用了没有业务字段的coin_user表,逻辑不匹配。 - Balance模型的关联定义错误:
balances表单条记录唯一对应用户+币种,应该用belongsTo一对多关联,不是belongsToMany多对多,且关联方法没有写return语句,调用时会返回null。
修正方案
第一步:清理冗余表
不需要coin_user这张中间表,直接用balances表承担用户和币种的关联关系即可,可直接删除coin_user表的迁移和对应表结构。
第二步:修正模型关联定义
User 模型
// 关联用户所有余额记录 public function balances() { return $this->hasMany(Balance::class); } // 关联用户持有的所有币种,直接带余额字段 public function coins() { return $this->belongsToMany(Coin::class, 'balances') ->withPivot(['symbol', 'balance']); }
Coin 模型
// 关联币种所有余额记录 public function balances() { return $this->hasMany(Balance::class); } // 关联持有该币种的所有用户,直接带余额字段 public function users() { return $this->belongsToMany(User::class, 'balances') ->withPivot(['symbol', 'balance']); }
Balance 模型
// 单条余额记录对应用户 public function user() { return $this->belongsTo(User::class); } // 单条余额记录对应币种 public function coin() { return $this->belongsTo(Coin::class); }
第三步:调整查询代码
场景1:获取所有持有比特币的用户及对应余额
// 先获取比特币币种对象 $btc = Coin::where('symbol', 'BTC')->first(); // 预加载关联的用户数据 $btc->load('users'); foreach ($btc->users as $user) { // 直接通过pivot获取余额 echo $user->name . '的BTC余额:' . $user->pivot->balance; }
场景2:获取指定用户的比特币余额
$user = User::find(1); // 不存在持有时默认返回0 $btcBalance = $user->coins()->where('symbol', 'BTC')->first()?->pivot->balance ?? 0;
内容的提问来源于stack exchange,提问作者Mojtaba Delshad
相关产品推荐
相关产品推荐

