使用 Laravel 查询数据并按天分组
Posted
技术标签:
【中文标题】使用 Laravel 查询数据并按天分组【英文标题】:Querying Data and Grouping by Day with Laravel 【发布时间】:2015-06-27 11:34:06 【问题描述】:我经营一个存储图像的网站,用户获得了热链接。
我希望能够在包含上传图像数据的表中查询过去 7 天的记录,仅提取 created_at
列,并将数据编译成数组,类似于为博客。
我希望结果显示如下:
[
'Sunday' => 5,
'Monday' => 45,
'Tuesday' => 452,
...
]
其中每个数字代表每天创建的记录数。只要能输出这样的数组,javascript端就可以轻松搞定。
有人有什么建议吗?
编辑
这是我目前尝试过的代码:
<?php
class Admin
public function getCreatedAtAttribute($value)
$this->attributes['created_at'] = Carbon::createFromFormat('Y-m-d H:i:s', $value);
public static function uploadsGraph()
$date = \Carbon\Carbon::now();
$uploads = Upload::select('created_at')->where('created_at', '>=', \Carbon\Carbon::now()->subWeek())->get();
foreach($uploads as $date)
echo $date->created_at . '<br>';
编辑 2
这是我尝试过的另一个版本,但效果不佳。
class Admin
public static function uploadsGraph()
$date = \Carbon\Carbon::now();
$uploadsByDay = DB::table('uploads')
->select(DB::raw('
YEAR(created_at) year,
MONTH(created_at) month,
MONTHNAME(created_at) month_name
'))
->groupBy('year')
->groupBy('month')
->orderBy('year', 'desc')
->orderBy('month', 'desc')
->get();
dd($uploadsByDay);
【问题讨论】:
你试过了吗?你写过代码吗?我们不会创建您的代码。 你问的是如何查询数据,或者如何制作图表? @Arjan96s 对不起,我已经包含了我目前尝试过的代码。 @watcher 我只想查询数据。 javascript部分我自己能搞清楚。 【参考方案1】:我假设一周中每一天旁边的数字代表当天的记录数,您要查询的整个数据集仅在过去 7 天范围内。
这里的想法是选择在同一天创建的项目的计数(完全忽略 created_at
列的时间戳部分),因此我们可以在 select()
调用中使用 DB::raw
来聚合在特定日期创建的所有条目,然后将该数据集限制为仅在上周创建的条目。像这样的东西应该可以工作:
$data = Upload::select([
// This aggregates the data and makes available a 'count' attribute
DB::raw('count(id) as `count`'),
// This throws away the timestamp portion of the date
DB::raw('DATE(created_at) as day')
// Group these records according to that day
])->groupBy('day')
// And restrict these results to only those created in the last week
->where('created_at', '>=', Carbon\Carbon::now()->subWeeks(1))
->get()
;
$output = [];
foreach($data as $entry)
$output[$entry->day] = $entry->count;
print_r($output);
还请注意,我假设这是一个“滚动”周,如果 今天 恰好是 星期四,那么数据集中的第一个日期将是上一个星期四。如果您需要,它不会在最近的星期日开始。如果是,您可以将-where()
条件更改为:
...
->where('created_at', '>=', Carbon\Carbon::parse('last sunday'))
...
【讨论】:
【参考方案2】:DB::table("clicks")
->select("id" ,DB::raw("(COUNT(*)) as total_click"))
->orderBy('created_at')
->groupBy(DB::raw("MONTH(created_at)"))
->get();
【讨论】:
以上是关于使用 Laravel 查询数据并按天分组的主要内容,如果未能解决你的问题,请参考以下文章