繁体   English   中英

Laravel Eloquent GroupBy 多对一关系

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM