当我使用count
or sum
方法,我得到了错误的结果。
例如:
Member::groupBy('id')->count()
我用另一种方法只得到结果1
Member::count()
我得到了正确的结果。
使用时得到错误的结果sum
method.
https://github.com/laravel/framework/issues/14123 https://github.com/laravel/framework/issues/14123
忘了说,我的 laravel 版本信息:
Laravel Framework version 5.1.40 (LTS)
实际项目中的问题
我有一个充值日志表.
1.工资日志表
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);
2.说明
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
modify ->mergeBindings($query)
to ->mergeBindings($query->getQuery())
测试实例(discard)
-
创建表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;
-
测试数据
INSERT INTO hc_members (id, name, amount) VALUES
(1,'aaa',10.00),
(2,'bbb',10.00),
(3,'ccc',10.00);
测试结果
我希望当我使用该方法时Member::groupBy('name')->count()
I want result 3
实际上它返回 1.
当我使用该方法时Member::groupBy('name')->sum('amount')
I want 结果 30.00
实际上它返回 10.00
感谢您的回答帮助我解决问题!