【问题标题】:Query with whereHas and sum of relationship column使用 whereHas 和关系列的总和进行查询
【发布时间】:2021-01-14 09:47:10
【问题描述】:

我有一个使用关系表中的值总和添加自定义“余额”列的查询。

User::withCount(['transactions as balance' => function($query) {
     $query->select(\DB::raw('sum(credit_movement)'));
}]);

这适用于返回“余额”列。


现在,我想过滤“余额”列的用户。

->where('balance', '<', 0);

如果我将它链接到查询,它将无法工作,因为“余额”列不存在。

User::withCount(['transactions as balance' => function($query) {
     $query->select(\DB::raw('sum(credit_movement)'));
}])
->where('balance', '<', 0);

我尝试过使用

User::withCount(['transactions as balance' => function($query) {
     $query->select(\DB::raw('sum(credit_movement)'));
}])
->having('balance', '<', 0); // won't work

// also:
->havingRaw('balance < 0'); // won't work

但这些都不起作用。

“有子句”中的未知列“余额”

我希望查询只返回余额小于 0 的用户。(我想在查询生成器中实现它,而不是集合上的 -&gt;filter()


更新:

我尝试使用whereHas(),但无法正确写入

User::withCount(['transactions as balance' => function($query) {
     $query->select(\DB::raw('sum(credit_movement)'));
}])
   ->whereHas('transactions', function($q) {
      $q->whereRaw('sum(credit_movement), < ?', 0);
   });

语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 ' 附近使用的正确语法

【问题讨论】:

  • 试试balance_count而不是balance
  • withCount 计算从选择返回的模型。它不进行分组,因此您不能使用having。您可以尝试执行whereHas 并在函数内执行 groupBy/have。虽然没有尝试过,所以不确定它是否会起作用。
  • 我尝试使用 whereHas(),但无法使用 sum 编写 where 查询。 -&gt;where('sum(credit_movement)', '&lt;', 0)-&gt;whereRaw('sum(credit_movement) &lt; ?, 0)。你们对此有什么想法吗?
  • -&gt;whereRaw('sum(credit_movement) &lt;= 0') 这会有帮助吗?
  • @dqureshiumar 它返回General error: 1111 Invalid use of group function

标签: laravel eloquent query-builder


【解决方案1】:

终于搞定了:

User::whereHas('transactions', function($q) {
   $q->select(\DB::raw('SUM(credit_movement) as balance'))
       ->havingRaw('balance < 0');
   });
});

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 2021-09-05
    • 2021-05-25
    • 1970-01-01
    • 2022-01-27
    • 2018-06-19
    • 2015-08-12
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多