【问题标题】:Using where based on relationships with Laravel根据与 Laravel 的关系使用 where
【发布时间】:2021-01-14 08:07:48
【问题描述】:

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

User::with('info');

这适用于返回“信息”关系。


现在我想查询基于。

  • where('info.allowance', null);

如果我试试这个:

User::with(['info' => function($q) {
   return $q->where('allowance', '>', 0);
})

...它返回所有用户,但只返回允许大于 0 的用户的“信息”模型。这不是我想要的。

我想要的:只返回余量 > 0 的用户。

【问题讨论】:

    标签: laravel eloquent laravel-query-builder


    【解决方案1】:

    您正在寻找whereHas() 方法:

    User::with(['info' => function($q) {
      return $q->where('allowance', '>', 0);
    })->whereHas('info', function($q) {
      return $q->where('allowance', '>', 0);
    })->get();
    

    ->with() 用于预加载,因此$user->info 的每个实例都将被限制为传递的逻辑,但->whereHas() 限制了原始查询,因此它将仅返回与给定匹配的User 记录逻辑。

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

    【讨论】:

    • 您可以将该匿名函数保存到一个变量中,并将该变量用作whereHas 的第二个参数,而不必重写它
    • ...with(['info' => $func = function ($q) { ... })->whereHas('info', $func)->get();
    猜你喜欢
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2021-09-05
    • 2021-01-17
    • 2021-07-30
    • 2016-11-30
    • 2013-01-15
    相关资源
    最近更新 更多