使用 whereHas 和关系列的总和进行查询

Posted

技术标签:

【中文标题】使用 whereHas 和关系列的总和进行查询【英文标题】:Query with whereHas and sum of relationship column 【发布时间】: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 【参考方案1】:

终于搞定了:

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

【讨论】:

以上是关于使用 whereHas 和关系列的总和进行查询的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 使用“whereHas”获取嵌套关系

如何使用 whereHas 子句和关系获取数据?

whereHas 回调中的关系过滤器与 Eloquent

具有唯一值的列的 SQL 总和量

MariaDB/mysql SQL查询问题:我想根据另一列的组值对一列进行部分总和

Access VBA中一列的总和