文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 00:30

关注

本文小编为大家详细介绍“Laravel中如何用聚合函数计算总数”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel中如何用聚合函数计算总数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

假如有电子邮件订阅服务,希望显示订阅者的详情统计页面如下显示

订阅者总数确认(confirmed)未经证实(unconfirmed)取消(cancelled)拒绝(bounced)
20015050105

出于本文的目的,假设我们有一个subscribers包含以下格式数据的数据库表:

nameemailstatus
小明adam@hotmeteor.comconfirmed
小红taylor@laravel.comunconfirmed
小军jonathan@reinink.cacancelled
小花adam.wathan@gmail.combounced

大部分人的做法:

$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这样的方法,只适合再数据量不大的时候使用,如果我们的应用程序有数千或数百万订阅者,处理的时间会很慢,并且会使用大量内存。

条件聚合

实际上有一种非常简单的方法可以查询计算这些总数。诀窍是将条件放在聚合函数中。下面是一个 SQL 示例:

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 bouncedfrom subscribers total | confirmed | unconfirmed | cancelled | bounced-------+-----------+-------------+-----------+---------   200 |       150 |          50 |        30 |      25————————————————原文作者:4pmzzzzzzzzzz转自链接:https://learnku.com/articles/74652版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

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

$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 列(字段)

表迁移创建 boolean 字段 , model定义属于转换 此处不用model为代码示例,可自行替换为model

如果使用boolean当字段列,将更容易,比如要查询subscribers表中的用户是否为拥有不同的角色权限。假设subscribers表中有is_adminis_treasureris_editoris_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  返回 falsevar_dump(0 || null) //JavaScript 返回 nullconsole.log(0 || null)//SQL 返回 nullSELECT (0 or null) as result

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯