[英]Laravel Eloquent GroupBy Many To One Relationship
我有下表结构:
用户表
ID | 姓名 | 平衡 |
---|---|---|
1 | 用户 1 | 4 |
2 | 用户 2 | 2 |
3 | 用户 3 | 2 |
special_user 表
ID | 用户身份 | 地位 |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
订单表
ID | 用户身份 | 提供者 | 数量 | 日期 |
---|---|---|---|---|
1 | 1 | 提供者 1 | 10 | 16-01-2021 |
2 | 2 | 提供者 2 | 20 | 16-01-2021 |
3 | 3 | 提供者 1 | 10 | 16-01-2021 |
4 | 3 | 提供者 1 | 50 | 16-01-2021 |
5 | 1 | 提供者 3 | 15 | 16-01-2021 |
6 | 2 | 提供者 1 | 20 | 16-01-2021 |
我想要在刀片中的 output HTML 表是(适用于 2021 年 1 月 16 日)
提供者 | 用户(数量) | 特殊用户(金额) | 总金额 |
---|---|---|---|
提供者 1 | 1 个(60 美元) | 2 个(30 美元) | 90 美元 |
提供者 2 | 0 ($0) | 1 个(20 美元) | 20 美元 |
提供者 3 | 0 ($0) | 1 个(15 美元) | 15 美元 |
用户是他们的 ID 不在 special_user 表中的用户计数。
特殊用户是他们的 user_id 在 special_user 表中的特殊用户计数
(amount)是各类用户的订单金额之和
总金额是用户金额和特殊用户金额的总和。
以下是我尝试过的代码:
$top_providers = Orders::
whereNotNull('provider)
->whereBetween('created_at', [$start_1, $end_1])
->groupBy('provider')
->selectRaw('*, count(*) as total_trans, count(transactions.user_id) as
all_users_count')
->get();
上面的代码确实根据提供商对订单进行分组,但我无法对用户类型进行分组。
请帮忙。
谢谢
要获得所需的结果集,您可以执行 2 个查询,一个将获取特殊用户的 id,第二个将使用这些 id 在用户之间进行分叉
在普通 SQL 中,查询看起来像
select
provider,
sum(case when user_id not in(1,2) then 1 else 0 end) user_count,
sum(case when user_id not in(1,2) then amount else 0 end) user_amount,
sum(case when user_id in(1,2) then 1 else 0 end) special_user_count,
sum(case when user_id in(1,2) then amount else 0 end) special_user_amount,
sum(amount) total
from orders
group by provider
在 laravel 中,您可以使用带有原始方法的查询生成器
$specialUserIds = SpecialUsers::where('status' , 1)->pluck('user_id')->toArray();
$orders = DB::table('orders')
->select('provider',
DB::raw('sum(case when user_id not in('.$specialUserIds.') then 1 else 0 end) user_count'),
DB::raw('sum(case when user_id not in('.$specialUserIds.') then amount else 0 end) user_amount'),
DB::raw('sum(case when user_id in('.$specialUserIds.') then 1 else 0 end) special_user_count'),
DB::raw('sum(case when user_id in('.$specialUserIds.') then amount else 0 end) special_user_amount'),
DB::raw('sum(amount) total')
)
->whereNotNull('provider')
->whereBetween('created_at', [$start_1, $end_1])
->groupBy('provider')
->get();
或者您可以使用selectRaw使用参数绑定
此外,如果用户的特殊用户表中只有一行,我建议将该状态属性移动到主用户表中,而不是创建具有一对一关系的 2 个表
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.