Laravel中如何用聚合函数计算总数


本文小编为大家详细介绍“Laravel中如何用聚合函数计算总数”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel中如何用聚合函数计算总数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 假如有电子邮件订阅服务,希望显示订阅者的详情统计页面如下显示出于本文的目的,假设我们有一个subscribers包含以下格式数据数据库表:大部分人的做法:

$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();

上面先获取全部订阅者数据,然后再对这个结果集进行条件统计,使用集合.模型多条数据查询返回IlluminateDatabaseEloquentCollection这样的方法,只适合再数据量不大的时候使用,如果我们的应用程序有数千或数百万订阅者,处理的时间会很慢,并且会使用大量内存。条件聚合实际上有一种非常简单的方法可以查询计算这些总数。诀窍是将条件放在聚合函数中。下面是一个 SQL 示例:

select
count(*)astotal,
count(casewhenstatus='confirmed'then1end)asconfirmed,
count(casewhenstatus='unconfirmed'then1end)asunconfirmed,
count(casewhenstatus='cancelled'then1end)ascancelled,
count(casewhenstatus='bounced'then1end)asbounced
fromsubscribers

total|confirmed|unconfirmed|cancelled|bounced
-------+-----------+-------------+-----------+---------
200|150|50|30|25

————————————————
原文作者:4pmzzzzzzzzzz
转自链接:https://learnku.com/articles/74652
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

以下是在 Laravel 中使用查询构建器编写此查询:

$totals=DB::table('subscribers')
->selectRaw('count(*)astotal')
->selectRaw("count(casewhenstatus='confirmed'then1end)asconfirmed")
->selectRaw("count(casewhenstatus='unconfirmed'then1end)asunconfirmed")
->selectRaw("count(casewhenstatus='cancelled'then1end)ascancelled")
->selectRaw("count(casewhenstatus='bounced'then1end)asbounced")
->first();

Total:{{$totals->total}}
Confirmed:{{$totals->confirmed}}
Unconfirmed:{{$totals->unconfirmed}}
Cancelled:{{$totals->cancelled}}
Bounced:{{$totals->bounced}}

Boolean 列(字段)表迁移创建 boolean 字段 , model定义属于转换 此处不用model为代码示例,可自行替换为model如果使用boolean当字段列,将更容易,比如要查询subscribers表中的用户是否为拥有不同的角色权限。假设subscribers表中有is_adminis_treasureris_editoris_manager、字段

$totals=DB::table('subscribers')
->selectRaw('count(*)astota免费云主机域名l')
->selectRaw('count(is_adminornull)asadmins')
->selectRaw('count(is_treasurerornull)astreasurers')
->selectRaw('count(is_editorornull)aseditors')
->selectRaw('count(is_managerornull)asmanagers')
->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(0ornull)asresult

读到这里,这篇“Laravel中如何用聚合函数计算总数”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: Minio与SpringBoot使用okhttp3问题如何解决

这篇文章主要介绍“Minio与SpringBoot使用okhttp3问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Minio与SpringBoot使用okhttp3问题如何解决”文章能帮助大家解决问题。使用…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/09 10:13
下一篇 03/09 10:13

相关推荐