Artikel ini membawakan anda pengetahuan yang berkaitan tentang Laravel terutamanya cara menggunakan fungsi agregat bersyarat untuk mengira jumlah dalam Laravel. Saya harap ia dapat membantu rakan-rakan yang memerlukannya.
Jika terdapat perkhidmatan langganan e-mel, anda ingin memaparkan halaman statistik terperinci pelanggan seperti yang ditunjukkan di bawah
订阅者总数 | 确认(confirmed) | 未经证实(unconfirmed) | 取消(cancelled) | 拒绝(bounced) |
---|---|---|---|---|
200 | 150 | 50 | 10 | 5 |
Daripada artikel ini Untuk tujuan tersebut, katakan kita mempunyai subscribers
jadual pangkalan data yang mengandungi data dalam format berikut:
name | status | |
---|---|---|
小明 | adam@hotmeteor.com | confirmed |
小红 | taylor@laravel.com | unconfirmed |
小军 | jonathan@reinink.ca | cancelled |
小花 | adam.wathan@gmail.com | bounced |
Perkara yang kebanyakan orang lakukan:
$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();
Perkara di atas Ia pasti akan menghasilkan lima kenyataan, yang pastinya adalah perkara yang tidak baik untuk dilakukan. Jadi jika kami cuba mengoptimumkannya, kami akan menggunakan kaedah lain untuk menyelesaikan masalah melaksanakan berbilang kenyataan:
$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();
Pertama di atas memperoleh semua data pelanggan, dan kemudian melakukan statistik bersyarat pada set hasil ini, menggunakan 集合
Model berbilang pertanyaan data kembalikan IlluminateDatabaseEloquentCollection
. Kaedah ini hanya sesuai digunakan apabila jumlah data tidak besar Jika aplikasi kita mempunyai ribuan atau jutaan pelanggan, masa pemprosesan akan menjadi sangat perlahan dan banyak memori akan digunakan.
Pengagregatan Bersyarat
Sebenarnya terdapat cara yang sangat mudah untuk membuat pertanyaan dan mengira jumlah ini. Caranya ialah meletakkan keadaan dalam fungsi agregat. Berikut ialah contoh 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 版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。
Berikut ialah cara menulis pertanyaan ini dalam Laravel menggunakan pembina pertanyaan:
$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>
Lajur Boolean (Medan)
Penghijrahan jadual mencipta medan boolean, definisi model tergolong dalam penukaran Model tidak digunakan sebagai contoh kod di sini, anda boleh menggantikannya dengan model
jika anda menggunakan boolean
Apabila medan disenaraikan, ia akan menjadi lebih mudah, sebagai contoh, untuk bertanya sama ada pengguna dalam jadual subscribers
mempunyai keizinan peranan yang berbeza. Andaikan bahawa jadual subscribers
mempunyai is_admin
, is_treasurer
, is_editor
, is_manager
, medan
$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();
Ini kerana fungsi agregat count
mengabaikan lajur null
. Tidak seperti dalam PHP yang false || null
mengembalikan false
, dalam SQL (dan JavaScript) ia mengembalikan null
. Pada asasnya, A
mengembalikan nilai A || B
jika A
boleh dipaksa kepada benar jika tidak, B
dikembalikan.
Jika anda tidak memahami perenggan ini, sila baca penjelasan saya di bawah:
Gunakan lajur boolean
laravel Medan dalam jadual data sebenar ialah tinyint
dan nilainya ialah 0(false)
dan 1(true)
Contohnya, medan
Xiao Ming ialah is_admin
, dan 1(true)
boleh dilihat sebagai count(is_admin or null)
Jika (1 or null)
benar, A
dikembalikan, dan sql akhir ialah A
. count(is_admin)
Sebaliknya, jika medan
ialah is_admin
dan sql akhir ialah 0(false)
, maka lajur ini diabaikan count(null)
//PHP 返回 false var_dump(0 || null) //JavaScript 返回 null console.log(0 || null) //SQL 返回 null SELECT (0 or null) as result
Terjemahan teks asal : Artikel ini hanyalah terjemahan kasar Maksudnya, gunakan sahaja ia sebagai rekod anda sendiri
Pembelajaran yang disyorkan: "tutorial video laravel"
Atas ialah kandungan terperinci Artikel yang menerangkan secara terperinci cara Laravel menggunakan fungsi agregat untuk mengira jumlah (dengan contoh kod). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!