Eloquent中count()是统计集合还是执行SQL COUNT?两种Account计数方法是否等效?
关于Laravel统计Active账户的两种写法解析
嘿,我来帮你理清这两个统计写法的区别,还有Laravel的count()到底是怎么干活的~
先明确核心问题:Laravel的count()方法是怎么统计的?
Laravel Eloquent自带的count()方法,是直接在数据库层面执行SQL的COUNT()函数,绝对不会傻乎乎把所有符合条件的行都拉到内存里,再一个个数对象数量。它会生成类似SELECT COUNT(*) FROM accounts WHERE status = 'active'的SQL,数据库直接返回统计好的数字,性能拉满。
对比你给出的两种写法
第一种写法:Account::select(DB::raw('count(*) as count'))->where('status','active')->get()->count
这个写法其实走了弯路,甚至结果都不对:
- 第一步:执行
SELECT COUNT(*) as count FROM accounts WHERE status = 'active',得到一个只包含1条记录的集合(这条记录里有个count字段存着真实总数) - 第二步:调用集合的
count()方法,统计这个集合里的元素个数——结果肯定是1,因为只有一行数据
所以你最后拿到的是1,而不是你想要的active账户总数!就算改成->first()->count能拿到正确数字,那也是多此一举,完全没必要绕这一圈。
第二种写法:Account::where('status','active')->count()
这才是标准且高效的正确写法:
- 它直接生成并执行
SELECT COUNT(*) FROM accounts WHERE status = 'active'的SQL - 数据库返回统计好的总数,Laravel直接把这个数字给你,没有多余的内存开销,速度最快
最后总结
- 这两种方法完全不相似,第一种属于逻辑有误(或者说写法冗余),第二种是官方推荐的最优解
- 记住:Eloquent的
count()是直接调用数据库的COUNT函数,别自己画蛇添足用get()->count,后者是用来统计内存里集合的元素数量,不是数据库里的行数
内容的提问来源于stack exchange,提问作者Birendra Gurung
相关产品推荐
相关产品推荐

