尝试从数据透视表中查找数据时给出Null

我在用户钱包模型之间有一个多对多的关系:

Wallet.php

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

User.php

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

数据透视表user_wallet是这样的:

然后在控制器,我需要访问该balance字段:

public function chargeWallet(Request $request, $wallet, $user)
{ 
            // $wallet is wallet_id (2) & $user is user_id (373)
            $bal = Wallet::with("users")
                ->whereHas('users', function ($query) use ($user) {
                    $query->where('id',$user);
                })->where('id', $wallet)->first();
            dd($bal->balance);
}

但现在我得到null了结果dd($bal->balance)!!

那么这里有什么问题呢?我怎样才能正确地得到balance

回答

由于它是多对多关系,您将用户附加到许多钱包,并且钱包附加到许多用户。对于单个钱包和单个用户之间的每个关系:您有一个枢轴值 ( pivotrelation)。从您的查询中,您将检索 Wallet with Users,每个用户都pivot附加了关系值。因此,要检索数据透视表数据(对于每个关系),您必须使用循环(添加with回调以确保只有具有匹配 user_id 的用户才急切加载钱包):

$bal = Wallet::with(["users"=>function ($query) use ($user) {
                $query->where('user_id',$user);
            }])
            ->whereHas('users', function ($query) use ($user) {
                $query->where('user_id',$user);
            })->find($wallet);

为避免重复相同的回调 ( where user_id =),您可以将其分配给变量:

$callback = function ($query) use ($user) {
     $query->where('user_id',$user);
};

然后在您的查询中使用它:

 $bal = Wallet::with(['users' => $callback])
                ->whereHas('users', $callback)->find($wallet);

然后使用 foreach 循环:

foreach ($bal->users as $value){
   dd($value->pivot->balance);
}

或者

如果您只想返回查询的第一个钱包的第一个用户的数据透视值,则:

$user = $bal->users->first();
dd($user->pivot->balance);


以上是尝试从数据透视表中查找数据时给出Null的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>