【问题标题】:Sorting Summed Collection by Timestamp按时间戳对汇总集合进行排序
【发布时间】:2016-11-17 20:52:31
【问题描述】:

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

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

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,
            }],

因此,如果不编写循环,那么在任何给定时间段内获取所有帖子的每日访问者总和的最佳方法是什么。基本上,一个用户拥有许多帖子,每个帖子都有很多访问者,所以下面是我如何获得所有帖子的总和,但正如您在上面看到的,我需要根据 created_at 时间戳中的每一天的总和访客表。

return Post::where('user_id', Auth::user()->id)->withCount(['visitors' => function($query)
        {
            $query->where('created_at', '<=', Carbon\Carbon::now())->where('created_at', '>=', Carbon\Carbon::yesterday());
        }])->get()->sum('visitors_count');

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    我不熟悉 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)
    

    【讨论】:

      【解决方案2】:

      这样的事情怎么样?

      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 的格式参数来更改数组键。

      【讨论】:

      • 这将在正常设置中工作。但是,因为一个用户是由他们的 cookie 值标识的,所以他们存在于访客表中。 Post 的唯一字符串是将每次访问与特定内容相关联的外部字符串。因此,一个用户可以访问十个页面,每个页面都是访问者表中的一个单独条目(以帮助代表访问者的历史记录和代表创建者的统计跟踪)。
      【解决方案3】:

      基本架构就是这样存在的

      Users:
      -id (A user owns many posts; Each post has many visitors)
      ... (etc.)
      
      Posts:
      -id (this is not the primary identifier)
      -uuid (this is the value that matters)
      -user_id (Foreign Key)
      ... (etc.)
      
      Visitors:
      -id
      -visitor_id
      -posts_uuid (Foreign Key)
      -created_at
      -updated_at
      

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

      【讨论】:

        【解决方案4】:

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

        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();
                }));
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-01
          • 2019-02-08
          • 1970-01-01
          相关资源
          最近更新 更多