Rumah  >  Artikel  >  rangka kerja php  >  Artikel yang menerangkan secara terperinci cara Laravel menggunakan fungsi agregat untuk mengira jumlah (dengan contoh kod)

Artikel yang menerangkan secara terperinci cara Laravel menggunakan fungsi agregat untuk mengira jumlah (dengan contoh kod)

藏色散人
藏色散人ke hadapan
2023-01-20 16:08:571302semak imbas

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.

Artikel yang menerangkan secara terperinci cara Laravel menggunakan fungsi agregat untuk mengira jumlah (dengan contoh kod)

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 email 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(&#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();

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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam