我有一个数据库表,用于注册每个类的点击率(
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 | |
+-------------+------------------+------+-----+-------------------+-------------------+
我想要获取的数据集:
我能够做到的最后一个(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。
预先感谢您的帮助。
由于没有指定,我假设每个日期可能有多个点击。
$result = Statistics::select('year')
->selectRaw('sum(hits) total_hits')
->where('class_id', 1)
->groupBy('year')
->orderBy('year')
->get();
这将返回包含 year 和 total_hits 值
的行集合或者更简单地使用这种形式,如果您的意思是“特定年份的总点击量”
$totalHits = Statistics::where('class_id', 1)
->where('year', 2021)
->sum('hits');
$theYear = 2021;
$result = Statistics::select('quarter')
->selectRaw('sum(hits) total_hits')
->where('class_id', 1)
->where('year', $theYear)
->groupBy('quarter')
->orderBy('quarter')
->get();
这将返回包含给定年份的 quarter 和 total_hits 值的行集合 ($theYear)
否则,如果您只想要特定年份和季度的总计,您可以这样做:
$totalHits = Statistics::where('class_id', 1)
->where('year', 2021)
->where('quarter', 1)
->sum('hits');
$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 使其独立于数据库表名称。
$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');