一文详解Laravel用聚合函数计算总数(附代码示例)
时间:2023-01-20 16:11
本篇文章给大家带来了关于Laravel的相关知识,其中主要给大家介绍在Laravel中怎么使用带有条件聚合函数来计算总数的,下面一起来看一下,希望对需要的朋友有所帮助。 假如有电子邮件订阅服务,希望显示订阅者的详情统计页面如下显示 出于本文的目的,假设我们有一个 大部分人的做法: 上面这样肯定会产生五条语句,这样做肯定是很不好。所以尝试优化一下,会使用另一个方法解决执行多条语句的问题: 上面先获取全部订阅者数据,然后再对这个结果集进行条件统计,使用 条件聚合 实际上有一种非常简单的方法可以查询计算这些总数。诀窍是将条件放在聚合函数中。下面是一个 SQL 示例: 以下是在 Laravel 中使用查询构建器编写此查询: Boolean 列(字段) 表迁移创建 boolean 字段 , model定义属于转换 此处不用model为代码示例,可自行替换为model 如果使用 这是因为聚合函数 这段话如果没理解,就看我下面说明: 翻译原文:本文只是翻译一下大概意思,作为自己单纯记录使用 推荐学习:《laravel视频教程》 以上就是一文详解Laravel用聚合函数计算总数(附代码示例)的详细内容,更多请关注gxlsystem.com其它相关文章!订阅者总数 确认(confirmed) 未经证实(unconfirmed) 取消(cancelled) 拒绝(bounced) 200 150 50 10 5 subscribers
包含以下格式数据的数据库表:name email status 小明 adam@hotmeteor.com confirmed 小红 taylor@laravel.com unconfirmed 小军 jonathan@reinink.ca cancelled 小花 adam.wathan@gmail.com bounced $total = Subscriber::count();
$confirmed = Subscriber::where('status', 'confirmed')->count();
$unconfirmed = Subscriber::where('status', 'unconfirmed')->count();
$cancelled = Subscriber::where('status', 'cancelled')->count();
$bounced = Subscriber::where('status', 'bounced')->count();
$subscribers = Subscriber::all();
$total = $subscribers->count();
$confirmed = $subscribers->where('status', 'confirmed')->count();
$unconfirmed = $subscribers->where('status', 'unconfirmed')->count();
$cancelled = $subscribers->where('status', 'cancelled')->count();
$bounced = $subscribers->where('status', 'bounced')->count();
集合
.模型多条数据查询返回Illuminate\Database\Eloquent\Collection
。这样的方法,只适合再数据量不大的时候使用,如果我们的应用程序有数千或数百万订阅者,处理的时间会很慢,并且会使用大量内存。select
count(*) as total,
count(case when status = 'confirmed' then 1 end) as confirmed,
count(case when status = 'unconfirmed' then 1 end) as unconfirmed,
count(case when status = 'cancelled' then 1 end) as cancelled,
count(case when status = 'bounced' then 1 end) as bounced
from subscribers
total | confirmed | unconfirmed | cancelled | bounced
-------+-----------+-------------+-----------+---------
200 | 150 | 50 | 30 | 25
————————————————
原文作者:4pmzzzzzzzzzz
转自链接:https://learnku.com/articles/74652
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。
$totals = DB::table('subscribers')
->selectRaw('count(*) as total')
->selectRaw("count(case when status = 'confirmed' then 1 end) as confirmed")
->selectRaw("count(case when status = 'unconfirmed' then 1 end) as unconfirmed")
->selectRaw("count(case when status = 'cancelled' then 1 end) as cancelled")
->selectRaw("count(case when status = 'bounced' then 1 end) as bounced")
->first();
<div>Total: {{ $totals->total }}</div>
<div>Confirmed: {{ $totals->confirmed }}</div>
<div>Unconfirmed: {{ $totals->unconfirmed }}</div>
<div>Cancelled: {{ $totals->cancelled }}</div>
<div>Bounced: {{ $totals->bounced }}</div>
boolean
当字段列,将更容易,比如要查询subscribers
表中的用户是否为拥有不同的角色权限。假设subscribers
表中有is_admin
、is_treasurer
、is_editor
、is_manager
、字段$totals = DB::table('subscribers')
->selectRaw('count(*) as total')
->selectRaw('count(is_admin or null) as admins')
->selectRaw('count(is_treasurer or null) as treasurers')
->selectRaw('count(is_editor or null) as editors')
->selectRaw('count(is_manager or null) as managers')
->first();
count
忽略null
列。与PHP中false || null
返回false
不同,在SQL(以及JavaScript)中,它返回null
。基本上,如果A
可以强制为真,则A || B
返回值A
;否则,返回B
。
使用laravel的boolean
列,实际数据表里字段为tinyint
,值为0(false)
与1(true)
, 比如
小明的is_admin
字段为1(true)
,count(is_admin or null)
可以看作表示为(1 or null)
,这A
为真 返回A
,最终sql为count(is_admin)
。
反之则是如is_admin
字段为0(false)
,最终sql为count(null)
,则忽略此列//PHP 返回 false
var_dump(0 || null)
//JavaScript 返回 null
console.log(0 || null)
//SQL 返回 null
SELECT (0 or null) as result