根据与 Laravel 的关系使用 where
Using where based on relationships with Laravel
我正在尝试根据 with()
关系过滤用户。通过过滤器,我的意思是根本不return那个用户。
User::with('info');
这适用于 return“信息”关系。
现在我要查询基于.
where('info.allowance', null);
如果我尝试这样做:
User::with(['info' => function($q) {
return $q->where('allowance', '>', 0);
})
...它 return 所有用户,但只有津贴 > 0 的用户的“信息”模型。这不是我想要的。
我想要的:return只有配额 > 0 的用户。
您正在寻找 whereHas()
方法:
User::with(['info' => function($q) {
return $q->where('allowance', '>', 0);
})->whereHas('info', function($q) {
return $q->where('allowance', '>', 0);
})->get();
->with()
用于 eager-loading,因此 $user->info
的每个实例都将被限制为传递的逻辑,但是 ->whereHas()
会限制原始查询,因此它会return 只有 User
条符合给定逻辑的记录。
旁注,你对两者使用相同的子句看起来很奇怪,但你可以(在这种情况下应该)。
我正在尝试根据 with()
关系过滤用户。通过过滤器,我的意思是根本不return那个用户。
User::with('info');
这适用于 return“信息”关系。
现在我要查询基于.
where('info.allowance', null);
如果我尝试这样做:
User::with(['info' => function($q) {
return $q->where('allowance', '>', 0);
})
...它 return 所有用户,但只有津贴 > 0 的用户的“信息”模型。这不是我想要的。
我想要的:return只有配额 > 0 的用户。
您正在寻找 whereHas()
方法:
User::with(['info' => function($q) {
return $q->where('allowance', '>', 0);
})->whereHas('info', function($q) {
return $q->where('allowance', '>', 0);
})->get();
->with()
用于 eager-loading,因此 $user->info
的每个实例都将被限制为传递的逻辑,但是 ->whereHas()
会限制原始查询,因此它会return 只有 User
条符合给定逻辑的记录。
旁注,你对两者使用相同的子句看起来很奇怪,但你可以(在这种情况下应该)。