이 기사는 Laravel에 대한 관련 지식을 제공합니다. Laravel에서 합계를 계산하기 위해 조건부 집계 함수를 사용하는 방법을 함께 살펴보겠습니다.
이메일 구독 서비스가 있는 경우, 구독자 상세 통계 페이지를 다음과 같이 표시하고 싶습니다
총 구독자 수 | 확인(확인) | Unconfirmed(미확인) | 취소됨 (취소됨) ) | bounced |
---|---|---|---|---|
200 | 150 | 50 | 10 | 5 |
구독자 code> 다음 형식의 데이터가 포함된 데이터베이스 테이블: <code>subscribers
包含以下格式数据的数据库表:
name | 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();
上面先获取全部订阅者数据,然后再对这个结果集进行条件统计,使用集合
.模型多条数据查询返回IlluminateDatabaseEloquentCollection
。这样的方法,只适合再数据量不大的时候使用,如果我们的应用程序有数千或数百万订阅者,处理的时间会很慢,并且会使用大量内存。
条件聚合
实际上有一种非常简单的方法可以查询计算这些总数。诀窍是将条件放在聚合函数中。下面是一个 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 bounced from 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_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)
email
status
//PHP 返回 false var_dump(0 || null) //JavaScript 返回 null console.log(0 || null) //SQL 返回 null SELECT (0 or null) as result🎜 위의 내용은 분명히 다섯 가지 진술을 생성할 것이며 이는 확실히 좋지 않습니다. 따라서 최적화를 시도하면 여러 문을 실행하는 문제를 해결하기 위해 다른 방법을 사용할 것입니다. 🎜rrreee🎜위는 먼저 모든 구독자 데이터를 얻은 다음
세트를 사용하여 이 결과 세트에 대해 조건부 통계를 수행합니다.
. 여러 데이터 쿼리가 IlluminateDatabaseEloquentCollection
을 반환합니다. 이 방법은 데이터의 양이 많지 않은 경우에만 사용하기에 적합합니다. 우리 애플리케이션의 구독자가 수천 또는 수백만 명인 경우 처리 시간이 매우 느려지고 많은 메모리가 사용됩니다. 🎜🎜조건부 집계 🎜🎜 실제로 이러한 합계를 쿼리하고 계산하는 매우 간단한 방법이 있습니다. 비결은 조건을 집계 함수에 넣는 것입니다. 다음은 SQL 예입니다. 🎜rrreee🎜 쿼리 빌더를 사용하여 Laravel에서 이 쿼리를 작성하는 방법은 다음과 같습니다. 🎜rrreee🎜부울 열(필드)🎜🎜테이블 마이그레이션 생성boolean🎜 필드, 모델 정의는 코드 예시입니다. 여기에서 모델을 사용할 수 있습니다. 직접 모델로 교체하세요🎜🎜필드 열로 boolean
을 사용하면 더 쉬울 것입니다. 예를 들어 subscribers
테이블의 사용자를 쿼리하려는 경우 다른 역할 권한을 가집니다. subscribers
테이블에 is_admin
, is_treasurer
, is_editor
, is_manager
필드가 있다고 가정합니다. 🎜 rrreee🎜 이는 집계 함수 count
가 null
열을 무시하기 때문입니다. PHP에서 false
를 반환하는 false || null
과 달리 SQL(및 JavaScript)에서는 null
을 반환합니다. 기본적으로 A
를 true로 강제할 수 있으면 A || B
는 A
값을 반환하고, 그렇지 않으면 B
를 반환합니다. > 반환됩니다 >. 🎜🎜이 단락이 이해되지 않으면 아래 설명을 읽어보세요. 🎜laravel의 boolean
열을 사용하세요. 실제 데이터 테이블의 필드는 tinyint
이고 값은 0(false)
및 1(true)
입니다. 예를 들어 🎜Xiao Ming의 is_admin
필드는 1(true)입니다. code>, <code>count (is_admin 또는 null)
는 (1 또는 null)
로 표현된 것으로 간주할 수 있으며, A
가 true인 경우 A
가 반환되고, 최종 SQL은 count(is_admin)
입니다. 🎜반대로, is_admin
필드가 0(false)
이고 최종 SQL이 count(null)
이면 이 열은 무시하세요🎜rrreee🎜🎜 원본 번역🎜: 이 글은 여러분의 기록을 위해 일반적인 의미의 번역일 뿐입니다🎜🎜추천 학습: "🎜laravel 비디오 튜토리얼🎜"🎜🎜위 내용은 Laravel이 집계 함수를 사용하여 총계를 계산하는 방법을 자세히 설명하는 문서(코드 예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!