中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel中如何用聚合函數計算總數

發布時間:2023-02-01 10:41:33 來源:億速云 閱讀:122 作者:iii 欄目:編程語言

本文小編為大家詳細介紹“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 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_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  返回 false
var_dump(0 || null) 

//JavaScript 返回 null
console.log(0 || null)

//SQL 返回 null
SELECT (0 or null) as result

讀到這里,這篇“Laravel中如何用聚合函數計算總數”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤城市| 密云县| 合作市| 新平| 平远县| 龙州县| 黎城县| 东源县| 抚州市| 芮城县| 任丘市| 清原| 水城县| 雷波县| 进贤县| 沂源县| 芮城县| 湘潭县| 互助| 邳州市| 花垣县| 元朗区| 南和县| 常熟市| 临沭县| 项城市| 平顶山市| 新田县| 衡山县| 高青县| 牡丹江市| 塔河县| 石景山区| 彰化县| 兴业县| 新余市| 关岭| 汕尾市| 和硕县| 黄平县| 正阳县|