用eloquent查询数据库得到数值总和用于统计图表

问题描述 投票:0回答:1

我有一个数据库表,用于注册每个类的点击率(

class_id
),我正在尝试使用 Laravel Eloquent 查询数据库表以获取数据,如下所示,以便与图表一起使用。

数据库表结构:

+-------------+------------------+------+-----+-------------------+-------------------+
| Field       | Type             | Null | Key | Default           | Extra             |
+-------------+------------------+------+-----+-------------------+-------------------+
| id          | bigint unsigned  | NO   | PRI | NULL              | auto_increment    |
| class_id    | bigint unsigned  | NO   | MUL | NULL              |                   |
| hits        | bigint unsigned  | NO   |     | 0                 |                   |
| hit_date    | timestamp        | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| year        | year             | NO   |     | NULL              |                   |
| quarter     | tinyint unsigned | NO   |     | NULL              |                   |
| month       | tinyint unsigned | NO   |     | NULL              |                   |
| week        | tinyint unsigned | NO   |     | NULL              |                   |
| created_at  | timestamp        | YES  |     | NULL              |                   |
| updated_at  | timestamp        | YES  |     | NULL              |                   |
| deleted_at  | timestamp        | YES  |     | NULL              |                   |
+-------------+------------------+------+-----+-------------------+-------------------+

我想要获取的数据集:

  1. 按年份划分的总点击量,如“SUM(hits) AStotal_hits”(例如 2022、2023、2024);
  2. 按季度计算的总点击量,例如“SUM(hits) AStotal_hits”(例如 2023 年第 1、2、3 和 4 季度);
  3. 按月显示的总点击量,例如“SUM(hits) AStotal_hits”(例如,过去 12 个月显示的点击量/月);
  4. 每天的总点击量,如“SUM(hits) AStotal_hits”(例如当月的总点击量);

我能够做到的最后一个(4):

Statistics::select(DB::raw("SUM(`hits`) as total_hits"))
->where('class_id', 1)
->where('year',now()->year)
->where('month',now()->month)
->get();

我的问题是使用 Eloquent 获取数据,例如示例 1、2 和 3。

预先感谢您的帮助。

laravel eloquent statistics sum
1个回答
0
投票

由于没有指定,我假设每个日期可能有多个点击。

  1. 年度总点击量
$result = Statistics::select('year')
                    ->selectRaw('sum(hits) total_hits')
                    ->where('class_id', 1)
                    ->groupBy('year')
                    ->orderBy('year')
                    ->get();
          

这将返回包含 yeartotal_hits

的行集合

或者更简单地使用这种形式,如果您的意思是“特定年份的总点击量”

$totalHits = Statistics::where('class_id', 1)
                       ->where('year', 2021)
                       ->sum('hits');
  1. 季度总点击量

$theYear = 2021;

$result = Statistics::select('quarter')
                    ->selectRaw('sum(hits) total_hits')
                    ->where('class_id', 1)
                    ->where('year', $theYear)
                    ->groupBy('quarter')
                    ->orderBy('quarter')
                    ->get();

这将返回包含给定年份的 quartertotal_hits 值的行集合 ($theYear)

否则,如果您只想要特定年份和季度的总计,您可以这样做:

$totalHits = Statistics::where('class_id', 1)
                       ->where('year', 2021)
                       ->where('quarter', 1)
                       ->sum('hits');
  1. 每月总点击量
$classId = 1;
$monthsWanted = 12;
 
$lastMonths = Statistics::select('year', 'month')
                        ->distinct()
                        ->where('class_id', $classId)
                        ->orderByDesc('year')
                        ->orderByDesc('month')
                        ->limit($monthsWanted);
          
$statisticsTbName = (new Statistics())->getTable();
 
Statistics::select(["$statisticsTbName.year", "$statisticsTbName.month"])
          ->selectRaw('sum(hits) total_hits')
           
          ->joinSub($lastMonths, 'last_months', function ($join) use ($statisticsTbName) {
                $join->on("$statisticsTbName.year", '=', 'last_months.year')
                     ->on("$statisticsTbName.month", '=', 'last_months.month');
            })
                     
          ->where('class_id', $classId)
          ->groupBy("$statisticsTbName.year", "$statisticsTbName.month")
          ->orderBy("$statisticsTbName.year")
          ->orderBy("$statisticsTbName.month")
          ->get();

这将返回包含 year、数字形式的 month 以及最后 $monthsWanted 月份和 $classId class_id 的相对 total_hits 值的行集合。 由于 Statistics 模型具有非规范名称,我还引入了 $statisticsTbName 使其独立于数据库表名称。

  1. 每日总点击量
$now = now();

$result = Statistics::select('hit_date')
                    ->selectRaw('sum(hits) total_hits')
                    ->where('class_id', 1)
                    ->where('year', $now->year)
                    ->where('month', $now->month)
                    ->groupBy('hit_date')
                    ->get();

这将返回包含日期和当月每一天的 total_hits 值的行集合。 $now 变量可以避免在一年的最后一天 23:59:59 执行查询时出现任何问题。

您还可以使用:

$result = Statistics::selectRaw('extract(day from hit_date) day')
          .......    

以数字而不是日期的形式获取日期。

否则,如果您只想要“当月的总点击量”,您可以这样做:

$totalHits = Statistics::where('class_id', 1)
                       ->where('year', $now->year)
                       ->where('month', $now->month)
                       ->sum('hits');
© www.soinside.com 2019 - 2024. All rights reserved.