Maison  >  Article  >  cadre php  >  Un article expliquant en détail comment Laravel utilise les fonctions d'agrégation pour calculer les totaux (avec des exemples de code)

Un article expliquant en détail comment Laravel utilise les fonctions d'agrégation pour calculer les totaux (avec des exemples de code)

藏色散人
藏色散人avant
2023-01-20 16:08:571292parcourir

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.

Un article expliquant en détail comment Laravel utilise les fonctions d'agrégation pour calculer les totaux (avec des exemples de code)

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 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();

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

$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();

上面先获取全部订阅者数据,然后再对这个结果集进行条件统计,使用集合.模型多条数据查询返回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
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

以下是在 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>

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();

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

nom

email
statut

🎜🎜🎜🎜🎜小明🎜🎜adam@hotmeteor.com🎜🎜confirmé🎜🎜 🎜 🎜小红🎜🎜taylor @laravel.com🎜🎜non confirmé🎜🎜🎜🎜小jun🎜🎜jonathan@reinink.ca🎜🎜annulé🎜🎜🎜🎜小花🎜🎜adam.wathan@gmail.com🎜🎜rebondi🎜 🎜🎜 🎜🎜🎜Ce que font la plupart des gens :🎜
//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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer