按时间戳排序求和集合

时间:2016-11-17 20:52:32

标签: php mysql laravel eloquent

在上一篇文章中,我询问了总计最终成为Laravel中值sum()的问题。然而,当数据返回时,它只输出总和而没有通常也会​​输出的任何其他信息(例如:关系,时间戳等)。通常情况下,如果我只是将所有内容的总和作为一个数字,这不会成为一个问题。

下面是我正在重新创建的视觉效果的硬编码示例,下面是创建它的数据。

Line Morris.JS Chart

data: [{
                period: '2016-04',
                views: 2666,
            }, {
                period: '2016-05',
                views: 2778,
            }, {
                period: '2016-06',
                views: 4912,
            }, {
                period: '2016-07',
                views: 3767,
            }, {
                period: '2016-08',
                views: 6810,
            }, {
                period: '2016-09',
                views: 5670,
            }, {
                period: '2016-10',
                views: 4820,
            }, {
                period: '2016-11',
                views: 15073,
            }],

因此,如果没有编写循环,那么在任何给定时间段内获取所有帖子的每日访问量的最佳方式是什么。基本上,一个用户拥有很多帖子,每个帖子都有很多访问者,所以下面是我如何得到所有这些的总和,但正如你在上面所看到的,我需要根据{{1}来计算每一天的总和。访问者表中的时间戳。

created_at

4 个答案:

答案 0 :(得分:2)

我不熟悉Laravel。所以我可以告诉你如何在mySql中编写查询,也许你可以翻译:

您使用DATE()截断时间部分,因此每个人都有相同的日期yyyy-mm-dd,那么您可以GROUP BY这些日子一起COUNT(visitors)

您需要参数@user_id, @start_range, @end_range

请注意如何设置@end_range。如果您使用@end_range = 2016-11-17',则'2016-11-17 10:10:00'将超出该范围。因此,您应该使用2016-11-17 23:59:59

 SELECT DATE(created_at), count(visitors)
 FROM posts
 WHERE user_id = @user_id
   AND created_at BETWEEN @start_range
                      AND @end_range
 GROUP BY DATE(created_at)

答案 1 :(得分:0)

这样的事情怎么样?

function postsPerPeriod()
{
    $posts = Post::orderBy('created_at')->get()->groupBy(function ($date) {
        return Carbon::parse($date->created_at)->format('m');
    });

    return $posts->map(function ($month) {
        return $month->sum('visitors');
    })->toArray();
}

它会按月对帖子进行分组,然后计算每个月的访问者数量,并返回要发布的关联数组。您可以通过更改传递给Carbon的格式参数来更改数组键。

答案 2 :(得分:0)

基本模式就是这样存在

unname(sapply(df, function(x) x[which.min(abs(x))]))
#[1]  -1   0 -11

因此,必须是在某个时间段为用户拥有的任何帖子创建的访问者行。

答案 3 :(得分:0)

我用上面的一些输入解决了这个问题。我正在使用这种关系以向后的方式抓取内容,这对我来说非常好。以下是最终使用的函数:

public function displayPeriodOverPeriodGraphics()
    {
        return dd(Visitor::all()->where('posts.user_id', Auth::user()->id)->groupBy(function($query)
        {
            return Carbon\Carbon::parse($query->created_at)->format('d');
        })->map(function($total)
        {
            return $total->count();
        }));
    }