【发布时间】: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 的用户。(我想在查询生成器中实现它,而不是集合上的 ->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 查询。->where('sum(credit_movement)', '<', 0)或->whereRaw('sum(credit_movement) < ?, 0)。你们对此有什么想法吗? -
->whereRaw('sum(credit_movement) <= 0')这会有帮助吗? -
@dqureshiumar 它返回
General error: 1111 Invalid use of group function
标签: laravel eloquent query-builder