Cet article vous apporte des connaissances pertinentes sur Laravel. Il présente principalement comment utiliser les fonctions d'agrégation conditionnelles pour calculer le total dans Laravel. J'espère qu'il sera utile aux amis dans le besoin.
S'il existe un service d'abonnement par courrier électronique, vous souhaitez afficher la page de statistiques détaillées des abonnés comme suit
Nombre total d'abonnés | Confirmé(confirmé) | Non confirmé(non confirmé) | Annulé (annulé) ) | rebondi |
---|---|---|---|---|
200 | 150 | 50 | 10 | 5 |
Pour les besoins de cet article, disons que nous avons un abonnés code> Table de base de données contenant des données au format suivant : <code>subscribers
包含以下格式数据的数据库表:
name | 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_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)
,count(is_admin or null)
可以看作表示为(1 or null)
,这A
为真 返回A
,最终sql为count(is_admin)
。
反之则是如is_admin
字段为0(false)
,最终sql为count(null)
email
statut
//PHP 返回 false var_dump(0 || null) //JavaScript 返回 null console.log(0 || null) //SQL 返回 null SELECT (0 or null) as result🎜Ce qui précède produira certainement cinq déclarations, ce qui n'est certainement pas bon. Donc, si j'essaie de l'optimiser, j'utiliserai une autre méthode pour résoudre le problème de l'exécution de plusieurs instructions : 🎜rrreee🎜Ce qui précède obtient d'abord toutes les données des abonnés, puis effectue des statistiques conditionnelles sur cet ensemble de résultats, en utilisant le
set. Plusieurs requêtes de données renvoient <code>IlluminateDatabaseEloquentCollection
. Cette méthode ne convient que lorsque la quantité de données n'est pas importante. Si notre application compte des milliers ou des millions d'abonnés, le temps de traitement sera très lent et beaucoup de mémoire sera utilisée. 🎜🎜Agrégation conditionnelle 🎜🎜Il existe en fait un moyen très simple d'interroger et de calculer ces totaux. L'astuce consiste à mettre la condition dans une fonction d'agrégation. Voici un exemple SQL : 🎜rrreee🎜 Voici comment écrire cette requête dans Laravel à l'aide du générateur de requêtes : 🎜rrreee🎜Colonne booléenne (champ)🎜🎜Création de migration de tablechamp booléen🎜, la définition du modèle est un exemple de code. Vous pouvez utiliser le modèle ici. Remplacez-le par model yourself🎜🎜Si vous utilisez boolean
comme colonne de champ, ce sera plus facile, par exemple, si vous souhaitez demander si les utilisateurs de la table abonnés
avoir des autorisations de rôle différentes. Supposons que la table subscribers
comporte des champs is_admin
, is_treasurer
, is_editor
, is_manager
. 🎜 rrreee🎜C'est parce que la fonction d'agrégation count
ignore les colonnes null
. Contrairement à false || null
qui renvoie false
en PHP, en SQL (et JavaScript), il renvoie null
. Fondamentalement, si A
peut être forcé à vrai, alors A || B
renvoie la valeur A
sinon, B
; > est renvoyé >. 🎜🎜Si vous ne comprenez pas ce paragraphe, veuillez lire mon explication ci-dessous : 🎜Utilisez la colonne boolean
de Laravel. Le champ dans la table de données réelle est tinyint
et la valeur. est 0 (false)
et 1(true)
, par exemple, le champ is_admin
de 🎜Xiao Ming est 1(true) code>, <code>count (is_admin ou null)
peut être considéré comme exprimé sous la forme (1 ou null)
, si A
est vrai, Un
est renvoyé et le SQL final est count(is_admin)
. 🎜Au contraire, si le champ is_admin
est 0(false)
et que le sql final est count(null)
, alors cette colonne sera être ignoré🎜rrreee🎜🎜 Traduction originale🎜 : Cet article traduit simplement le sens général et est utilisé pour vos propres dossiers🎜🎜Étude recommandée : "🎜tutoriel vidéo laravel🎜"🎜🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!