站長資訊網
最全最豐富的資訊網站

一文詳解Laravel用聚合函數計算總數(附代碼示例)

本篇文章給大家帶來了關于Laravel的相關知識,其中主要給大家介紹在Laravel中怎么使用帶有條件聚合函數來計算總數的,下面一起來看一下,希望對需要的朋友有所幫助。

一文詳解Laravel用聚合函數計算總數(附代碼示例)

假如有電子郵件訂閱服務,希望顯示訂閱者的詳情統計頁面如下顯示

訂閱者總數 確認(confirmed) 未經證實(unconfirmed) 取消(cancelled) 拒絕(bounced)
200 150 50 10 5

出于本文的目的,假設我們有一個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('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_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視頻教程》

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
亚洲国产高清精品线久久| 日韩色日韩视频亚洲网站| 午夜精品久久久久久久无码| 91人前露出精品国产| 亚洲国产主播精品极品网红| 国产精品福利在线播放| 国产三级国产精品国产普男人| 国语自产精品视频在线完整版| 久久精品国产半推半就| 日韩精品在线一区二区| 日韩精品一区二区三区老鸭窝| 久久99国产这里有精品视| 亚洲精品无码av天堂| 亚洲欧美日韩综合久久久| 久久中文字幕精品| 国产亚洲精品美女久久久 | 中日韩精品无码一区二区三区| 国产精品盗摄一区二区在线| 日韩精品无码专区免费播放| 老司机午夜精品视频播放| 99久久国产亚洲综合精品| 久久精品国产99国产精偷| 中文字幕精品视频在线| 日韩亚洲国产综合久久久| 98视频精品全部国产| 亚洲国产精品无码中文字| 精品视频在线观看一区二区 | 2021日韩麻豆| 国产美女在线精品观看| 国产精品一二三区| 亚洲国产精品无码久久一区二区| 国产麻豆一精品一AV一免费| 国产自偷亚洲精品页65页 | 亚洲国产精品久久久久婷婷软件| 乱人伦精品视频在线观看 | 3d动漫精品啪啪一区二区中| 亚洲精品国产精品乱码视色| 日韩激情无码免费毛片| 成人精品一区二区不卡视频| 精品国产乱码久久久久软件| 国产成人精品午夜福利|