使用 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 查询数据并按天分组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多订单按天分组查看

Laravel Eloquent按天分组结果

如何简化 Laravel 查询以按年搜索日期并按月分组

MySQL按天计数和分组

Oracle查询语句怎么样按天分组

Laravel 选择列,然后按日期对列值进行分组