Heim > PHP-Framework > Laravel > Hauptteil

Ein Artikel, der ausführlich erklärt, wie Laravel Aggregatfunktionen zur Berechnung von Gesamtsummen verwendet (mit Codebeispielen)

藏色散人
Freigeben: 2023-01-20 16:11:48
nach vorne
1304 Leute haben es durchsucht

Dieser Artikel vermittelt Ihnen relevantes Wissen über Laravel. Er stellt vor allem die Verwendung bedingter Aggregatfunktionen zur Berechnung der Summe in Laravel vor. Ich hoffe, dass er für Freunde in Not hilfreich ist.

Ein Artikel, der ausführlich erklärt, wie Laravel Aggregatfunktionen zur Berechnung von Gesamtsummen verwendet (mit Codebeispielen)

Wenn es einen E-Mail-Abonnementdienst gibt, möchten Sie die Seite mit den Abonnentendetails und Statistiken wie unten gezeigt anzeigen

Gesamtzahl der Abonnenten Bestätigt (bestätigt) Unbestätigt (unbestätigt) Abgesagt(abgesagt) abgesprungen
200 150 50 10 5

Nehmen wir für die Zwecke dieses Artikels an Wir haben einen Abonnenten Datenbanktabelle mit Daten im folgenden Format: <code>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(&#39;status&#39;, &#39;confirmed&#39;)->count();
$unconfirmed = Subscriber::where(&#39;status&#39;, &#39;unconfirmed&#39;)->count();
$cancelled = Subscriber::where(&#39;status&#39;, &#39;cancelled&#39;)->count();
$bounced = Subscriber::where(&#39;status&#39;, &#39;bounced&#39;)->count();
Nach dem Login kopieren

上面这样肯定会产生五条语句,这样做肯定是很不好。所以尝试优化一下,会使用另一个方法解决执行多条语句的问题:

$subscribers = Subscriber::all();
$total = $subscribers->count();
$confirmed = $subscribers->where(&#39;status&#39;, &#39;confirmed&#39;)->count();
$unconfirmed = $subscribers->where(&#39;status&#39;, &#39;unconfirmed&#39;)->count();
$cancelled = $subscribers->where(&#39;status&#39;, &#39;cancelled&#39;)->count();
$bounced = $subscribers->where(&#39;status&#39;, &#39;bounced&#39;)->count();
Nach dem Login kopieren

上面先获取全部订阅者数据,然后再对这个结果集进行条件统计,使用集合.模型多条数据查询返回IlluminateDatabaseEloquentCollection这样的方法,只适合再数据量不大的时候使用,如果我们的应用程序有数千或数百万订阅者,处理的时间会很慢,并且会使用大量内存。

条件聚合

实际上有一种非常简单的方法可以查询计算这些总数。诀窍是将条件放在聚合函数中。下面是一个 SQL 示例:

select
  count(*) as total,
  count(case when status = &#39;confirmed&#39; then 1 end) as confirmed,
  count(case when status = &#39;unconfirmed&#39; then 1 end) as unconfirmed,
  count(case when status = &#39;cancelled&#39; then 1 end) as cancelled,
  count(case when status = &#39;bounced&#39; then 1 end) as bounced
from subscribers

 total | confirmed | unconfirmed | cancelled | bounced
-------+-----------+-------------+-----------+---------
   200 |       150 |          50 |        30 |      25

————————————————
原文作者:4pmzzzzzzzzzz
转自链接:https://learnku.com/articles/74652
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。
Nach dem Login kopieren

以下是在 Laravel 中使用查询构建器编写此查询:

$totals = DB::table(&#39;subscribers&#39;)
    ->selectRaw(&#39;count(*) as total&#39;)
    ->selectRaw("count(case when status = &#39;confirmed&#39; then 1 end) as confirmed")
    ->selectRaw("count(case when status = &#39;unconfirmed&#39; then 1 end) as unconfirmed")
    ->selectRaw("count(case when status = &#39;cancelled&#39; then 1 end) as cancelled")
    ->selectRaw("count(case when status = &#39;bounced&#39; 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>
Nach dem Login kopieren

Boolean 列(字段)

表迁移创建 boolean 字段 , model定义属于转换 此处不用model为代码示例,可自行替换为model

如果使用boolean当字段列,将更容易,比如要查询subscribers表中的用户是否为拥有不同的角色权限。假设subscribers表中有is_adminis_treasureris_editoris_manager、字段

$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();
Nach dem Login kopieren

这是因为聚合函数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)

Name

E-Mail
Status

🎜🎜🎜🎜🎜小明🎜🎜adam@hotmeteor.com🎜🎜bestätigt🎜🎜 🎜 🎜小红🎜🎜 taylor@laravel.com🎜🎜unbestätigt🎜🎜🎜🎜小jun🎜🎜jonathan@reinink.ca🎜🎜abgesagt🎜🎜🎜🎜小花🎜🎜adam.wathan@gmail.com🎜🎜b Unzen🎜🎜🎜 🎜🎜🎜Was die meisten Leute tun do:🎜
//PHP  返回 false
var_dump(0 || null) 

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

//SQL 返回 null
SELECT (0 or null) as result
Nach dem Login kopieren
🎜Das Obige führt definitiv zu fünf Aussagen, was definitiv nicht gut ist. Wenn ich also versuche, es zu optimieren, werde ich eine andere Methode verwenden, um das Problem der Ausführung mehrerer Anweisungen zu lösen: 🎜rrreee🎜Das Obige ruft zunächst alle Abonnentendaten ab und führt dann mithilfe des sets. Mehrere Datenabfragen geben <code>IlluminateDatabaseEloquentCollection zurück. Diese Methode eignet sich nur für den Einsatz, wenn die Datenmenge nicht groß ist. Wenn unsere Anwendung Tausende oder Millionen Abonnenten hat, ist die Verarbeitungszeit sehr langsam und es wird viel Speicher beansprucht. 🎜🎜Bedingte Aggregation🎜🎜Es gibt tatsächlich eine sehr einfache Möglichkeit, diese Summen abzufragen und zu berechnen. Der Trick besteht darin, die Bedingung in eine Aggregatfunktion einzufügen. Hier ist ein SQL-Beispiel: 🎜rrreee🎜 So schreiben Sie diese Abfrage in Laravel mit dem Abfrage-Builder: 🎜rrreee🎜Boolesche Spalte (Feld)🎜🎜Erstellung einer Tabellenmigrationboolean🎜 Feld, Modelldefinition ist ein Codebeispiel. Sie können das Modell hier verwenden. Ersetzen Sie es selbst durch „model“🎜🎜Wenn Sie boolean als Feldspalte verwenden, ist es beispielsweise einfacher, wenn Sie abfragen möchten, ob die Benutzer in der Tabelle subscribers enthalten sind haben unterschiedliche Rollenberechtigungen. Gehen Sie davon aus, dass die Tabelle subscribers die Felder is_admin, is_treasurer, is_editor, is_manager hat 🎜 rrreee🎜Das liegt daran, dass die Aggregatfunktion count null-Spalten ignoriert. Im Gegensatz zu false ||. null, das in PHP false zurückgibt, gibt es in SQL (und JavaScript) null zurück. Grundsätzlich gilt: Wenn A auf „true“ gesetzt werden kann, gibt A || B den Wert A zurück; > wird zurückgegeben >. 🎜🎜Wenn Sie diesen Absatz nicht verstehen, lesen Sie bitte meine Erklärung unten: 🎜Verwenden Sie die boolean-Spalte von Laravel. Das Feld in der tatsächlichen Datentabelle ist tinyint und der Wert ist 0 (false) und 1(true), zum Beispiel ist das Feld is_admin von 🎜Xiao Ming 1(true) code>, <code>count (is_admin oder null) kann als ausgedrückt angesehen werden als (1 oder null), wenn A wahr ist, A wird zurückgegeben und die endgültige SQL ist count(is_admin). 🎜Im Gegenteil, wenn das Feld is_admin 0(false) ist und die endgültige SQL count(null) ist, dann ist diese Spalte vorhanden ignoriert🎜rrreee🎜🎜 Übersetzter Originaltext🎜: Dieser Artikel ist nur eine allgemeine Übersetzung der Bedeutung für Ihre eigenen Unterlagen🎜🎜Empfohlenes Lernen: „🎜Laravel-Video-Tutorial🎜“🎜🎜

Das obige ist der detaillierte Inhalt vonEin Artikel, der ausführlich erklärt, wie Laravel Aggregatfunktionen zur Berechnung von Gesamtsummen verwendet (mit Codebeispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage