根据与 Laravel 的关系使用 where

Using where based on relationships with Laravel

我正在尝试根据 with() 关系过滤用户。通过过滤器,我的意思是根本不return那个用户。

User::with('info');

这适用于 return“信息”关系。


现在我要查询基于.


如果我尝试这样做:

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 条符合给定逻辑的记录。

旁注,你对两者使用相同的子句看起来很奇怪,但你可以(在这种情况下应该)。