>  기사  >  PHP 프레임워크  >  Laravel이 집계 함수를 사용하여 총계를 계산하는 방법을 자세히 설명하는 문서(코드 예제 포함)

Laravel이 집계 함수를 사용하여 총계를 계산하는 방법을 자세히 설명하는 문서(코드 예제 포함)

藏色散人
藏色散人앞으로
2023-01-20 16:08:571292검색

이 기사는 Laravel에 대한 관련 지식을 제공합니다. Laravel에서 합계를 계산하기 위해 조건부 집계 함수를 사용하는 방법을 함께 살펴보겠습니다.

Laravel이 집계 함수를 사용하여 총계를 계산하는 방법을 자세히 설명하는 문서(코드 예제 포함)

이메일 구독 서비스가 있는 경우, 구독자 상세 통계 페이지를 다음과 같이 표시하고 싶습니다

총 구독자 수 확인(확인) Unconfirmed(미확인) 취소됨 (취소됨) ) bounced
200 150 50 10 5

구독자 code> 다음 형식의 데이터가 포함된 데이터베이스 테이블: <code>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(&#39;status&#39;, &#39;confirmed&#39;)->count();
$unconfirmed = Subscriber::where(&#39;status&#39;, &#39;unconfirmed&#39;)->count();
$cancelled = Subscriber::where(&#39;status&#39;, &#39;cancelled&#39;)->count();
$bounced = Subscriber::where(&#39;status&#39;, &#39;bounced&#39;)->count();

上面这样肯定会产生五条语句,这样做肯定是很不好。所以尝试优化一下,会使用另一个方法解决执行多条语句的问题:

$subscribers = Subscriber::all();
$total = $subscribers->count();
$confirmed = $subscribers->where(&#39;status&#39;, &#39;confirmed&#39;)->count();
$unconfirmed = $subscribers->where(&#39;status&#39;, &#39;unconfirmed&#39;)->count();
$cancelled = $subscribers->where(&#39;status&#39;, &#39;cancelled&#39;)->count();
$bounced = $subscribers->where(&#39;status&#39;, &#39;bounced&#39;)->count();

上面先获取全部订阅者数据,然后再对这个结果集进行条件统计,使用集合.模型多条数据查询返回IlluminateDatabaseEloquentCollection这样的方法,只适合再数据量不大的时候使用,如果我们的应用程序有数千或数百万订阅者,处理的时间会很慢,并且会使用大量内存。

条件聚合

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

select
  count(*) as total,
  count(case when status = &#39;confirmed&#39; then 1 end) as confirmed,
  count(case when status = &#39;unconfirmed&#39; then 1 end) as unconfirmed,
  count(case when status = &#39;cancelled&#39; then 1 end) as cancelled,
  count(case when status = &#39;bounced&#39; 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(&#39;subscribers&#39;)
    ->selectRaw(&#39;count(*) as total&#39;)
    ->selectRaw("count(case when status = &#39;confirmed&#39; then 1 end) as confirmed")
    ->selectRaw("count(case when status = &#39;unconfirmed&#39; then 1 end) as unconfirmed")
    ->selectRaw("count(case when status = &#39;cancelled&#39; then 1 end) as cancelled")
    ->selectRaw("count(case when status = &#39;bounced&#39; 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(&#39;subscribers&#39;)
    ->selectRaw(&#39;count(*) as total&#39;)
    ->selectRaw(&#39;count(is_admin or null) as admins&#39;)
    ->selectRaw(&#39;count(is_treasurer or null) as treasurers&#39;)
    ->selectRaw(&#39;count(is_editor or null) as editors&#39;)
    ->selectRaw(&#39;count(is_manager or null) as managers&#39;)
    ->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)

name

email
status

🎜🎜🎜🎜🎜Xiao Ming🎜🎜adam@hotmeteor.com🎜🎜confirmed🎜🎜 🎜 🎜작은红🎜🎜 taylor@laravel.com🎜🎜확인되지 않음🎜🎜🎜🎜작은 Jun🎜🎜jonathan@reinink.ca🎜🎜취소됨🎜🎜🎜🎜작은꽃🎜🎜adam.wathan@gmail.com🎜🎜bounced🎜🎜 🎜 🎜🎜🎜대부분의 사람들은 do:🎜
//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🎜 이는 집계 함수 countnull 열을 무시하기 때문입니다. PHP에서 false를 반환하는 false || null과 달리 SQL(및 JavaScript)에서는 null을 반환합니다. 기본적으로 A를 true로 강제할 수 있으면 A || BA 값을 반환하고, 그렇지 않으면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제