laravel在groupBy之后使用count / sum方法

时间:2016-06-24 03:38:26

标签: php laravel count group-by sum

当我使用countsum方法时,我得到了错误的结果。

例如:

Member::groupBy('id')->count()

我只在另一种方法中获得结果1

Member::count()

我得到了正确的结果。

使用sum方法时,我得到错误的结果。

https://github.com/laravel/framework/issues/14123

忘了说,我的laravel版本信息:

Laravel Framework version 5.1.40 (LTS)



项目中的实际问题

我有充值日志表

1.pay log table

CREATE TABLE pay_logs (
   id int(11) NOT NULL AUTO_INCREMENT,
   amount decimal(20,2) DEFAULT '0.00',
   pay_sn varchar(20) DEFAULT NULL,
   join_date int(11) unsigned DEFAULT '0',
   PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.1支付日志数据

INSERT INTO pay_logs (id, amount, pay_sn, join_date)
VALUES
  (1,10.00,'aabbcc',1466753291),
  (2,10.00,'aabbcc',1466753292),
  (3,20.00,'bbccdd',1466753292),
  (4,30.00,'ccddee',1466753292);

4.产品说明

在pay_log表中,1和2记录相同。所以当想要按实际充值成功时间过滤结果时,我只需要一条记录,所以我使用groupBy操作。

我的错误操作

DB::table('pay_log')
 ->whereBetween('joinDate',[$beginToday,$endToday])
 ->where('isSucceed','=',1)
 ->where('type','=',1)
 ->groupBy('pay_sn');
 ->count();

最后,解决它。

$query = DB::table('pay_log')
 ->select(DB::raw('count(*) as num'))
 ->whereBetween('joinDate',[$beginToday,$endToday])
 ->where('isSucceed','=',1)
 ->where('type','=',1)
 ->groupBy('pay_sn');

ps:如果使用Eloquent ORM

->mergeBindings($query)修改为->mergeBindings($query->getQuery())



测试示例( discard

  1. create table sql

    CREATE TABLE members ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(15) DEFAULT NULL, amount decimal(20,2) DEFAULT '0.00', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

  2. 测试数据

    INSERT INTO hc_members (id, name, amount) VALUES (1,'aaa',10.00), (2,'bbb',10.00), (3,'ccc',10.00);

  3. 测试结果

  4. 我希望,当我使用方法Member::groupBy('name')->count()

    我想结果3

    实际上返回1


    当我使用方法Member::groupBy('name')->sum('amount')

    我想结果30.00

    实际上返回10.00



    感谢您的回答,帮助我解决问题!

1 个答案:

答案 0 :(得分:3)

这不是laravel的问题,因为Member::groupBy('id')->count()将返回每个ID的结果数量计数。 (Laravel只返回查询结果的第一行。)

尝试运行此查询

SELECT COUNT(*) AS aggregate FROM members GROUP BY 'id'

它将返回每个(id)聚合的行数。这是当您调用Member::groupBy('id')->count()时执行的查询,而laravel只需要一行,返回第一个聚合的计数。

如果您想要计算不同的ID,可以调用

Member::distinct('id')->count('id')

这与您的求和查询也返回10的原因相同。查询返回' amount'的总和。对于具有相同'名称'。

的群组

要获得所有金额的总和,只需致电,

Member::sum('amount');