尝试从数据透视表 table 中查找数据时给出 Null
Null is given when trying to find data from pivot table
我在 User 和 Wallet 模型之间存在多对多关系:
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');
}
枢轴 table 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);
}
但现在 dd($bal->balance)
结果是 null
!!
所以这里出了什么问题?我怎样才能正确获得 balance
?
因为它是多对多关系,你有用户附加到许多钱包,钱包附加到许多用户。对于单个钱包和单个用户之间的每个关系:你有一个枢轴值(pivot
关系)。从您的查询中,您将检索 Wallet with Users,每个用户都附加了 pivot
关系值。因此,要检索枢轴 table 数据(对于每个关系),您必须使用循环(添加 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);
}
或
如果您只想return查询第一个钱包的第一个用户的数据透视值,则:
$user = $bal->users->first();
dd($user->pivot->balance);
我在 User 和 Wallet 模型之间存在多对多关系:
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');
}
枢轴 table 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);
}
但现在 dd($bal->balance)
结果是 null
!!
所以这里出了什么问题?我怎样才能正确获得 balance
?
因为它是多对多关系,你有用户附加到许多钱包,钱包附加到许多用户。对于单个钱包和单个用户之间的每个关系:你有一个枢轴值(pivot
关系)。从您的查询中,您将检索 Wallet with Users,每个用户都附加了 pivot
关系值。因此,要检索枢轴 table 数据(对于每个关系),您必须使用循环(添加 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);
}
或
如果您只想return查询第一个钱包的第一个用户的数据透视值,则:
$user = $bal->users->first();
dd($user->pivot->balance);