這篇文章為大家帶來了關於Laravel的相關知識,其中主要給大家介紹在Laravel中怎麼使用帶有條件聚合函數來計算總數的,下面一起來看一下,希望對需要的朋友有所幫助。
假如有電子郵件訂閱服務,希望顯示訂閱者的詳情統計頁面如下顯示
訂閱者總數 | 確認(confirmed) | 未經確認(unconfirmed) | 取消(cancelled) | 拒絕(bounced) |
---|---|---|---|---|
#50 | 10 | 5 |
---|---|---|
出於本文的目的,假設我們有一個 | subscribers包含以下格式資料的資料庫表: | |
status | ||
#小明 | adam@hotmeteor.com | confirmed |
小紅 | taylor@laravel.com | unconfirmed |
#小花
adam.wathan@gmail.com
大部分人的做法:
$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_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)
,
可以看作表示為(1 or null),這
A為真回傳A,最終sql為
count(is_admin)
//PHP 返回 false var_dump(0 || null) //JavaScript 返回 null console.log(0 || null) //SQL 返回 null SELECT (0 or null) as result# #####翻譯原文###:本文只是翻譯一下大概意思,作為自己單純記錄使用######推薦學習:《###laravel影片教學###》######
以上是一文詳解Laravel用聚合函數計算總數(附程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!