使用 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 的用户。(我想在查询生成器中实现它,而不是集合上的 ->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
【参考方案1】:
终于搞定了:
User::whereHas('transactions', function($q)
$q->select(\DB::raw('SUM(credit_movement) as balance'))
->havingRaw('balance < 0');
);
);
【讨论】:
以上是关于使用 whereHas 和关系列的总和进行查询的主要内容,如果未能解决你的问题,请参考以下文章