未定义 属性:Illuminate\Database\Eloquent\Relations\BelongsToMany::$余额

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsToMany::$balance

我在 WalletUser 模型之间存在多对多关系:

User.php:

public function wallets()
    {
        return $this->belongsToMany(Wallet::class,'user_wallet','user_id','wallet_id')->withPivot('balance');
    }

Wallet.php:

public function users()
    {
        return $this->belongsToMany(User::class,'user_wallet','wallet_id','user_id')->withPivot('balance');
    }

枢轴 table user_wallet 是这样的:

现在我需要在 Blade 的 table 中获取钱包的名称和该钱包的余额。

所以在控制器上,我添加了这个:

public function index($id)
{
   // $id is the user id
   $userWallet = Wallet::with("users")->whereHas('users',function ($query)use($id){
      $query->where('user_id',$id);
   })->get();
}

然后在 Blade:

@forelse($userWallet as $wallet)
   <div class="message_fullName">
   {{ $wallet->name }}
   </div>

   <div class="message_tag">
   {{ $wallet->users()->balance }}
   </div>
@empty
   Empty
@endforelse

但是我得到这个错误:

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsToMany::$balance

那么这里出了什么问题?我怎样才能在枢轴 table 处正确获得 balance

那是因为您将关系的查询生成器对象与 users() 一起使用,但您需要 user 属性 来获取集合:

@forelse($userWallet as $wallet)
   <div class="message_fullName">
   {{ $wallet->name }}
   </div>

   <div class="message_tag">
   {{ $wallet->users->balance }}
   </div>
@empty
   Empty
@endforelse

但即使是集合实例也没有余额 属性 只要它不是自定义集合。您可能需要遍历集合或使用 pluck 来获取模型的 balance 属性:

@forelse($userWallet as $wallet)
   <div class="message_fullName">
   {{ $wallet->name }}
   </div>

   <div class="message_tag">
   {{ $wallet->users->pluck('balance')->join(', ') }}
   </div>
@empty
   Empty
@endforelse

你必须循环用户

@forelse($userWallet as $wallet)
   <div class="message_fullName">
   {{ $wallet->name }}
   </div>

   <div class="message_tag">
    @if(isset($wallet->users)&&count((array)$wallet->users))
      @foreach($wallet->users as $user)
        {{$user->pivot->balance }}
      @endforeach
    @endif
   </div>
@empty
   Empty
@endforelse

您的查询应该是

$userWallet = Wallet::with(["users"=>function ($query)use($id){
      $query->where('user_id',$id);
   }])->whereHas('users',function ($query)use($id){
      $query->where('user_id',$id);
   })->get();