2016-11-17 108 views
4

在之前的文章中,我询问了获得的总数是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, 
      }], 

所以无需编写循环,有什么去获得所有帖子游客每天总和任何给定时间的最佳方式。基本上,一个用户拥有很多帖子,每个帖子都有很多访问者,所以下面是我如何得到它们的总和,但正如你上面看到的,我需要根据游客表中的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'); 

回答

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

+0

这将工作在正常的设置。但是,由于一个用户通过其cookie值进行标识,因此它们存在于Visitors表中。邮政唯一的字符串是外国人,每个访问涉及一个特定的内容。因此,一个用户可以访问10个页面,每个页面都是访问者表中的单独条目(代表访问者的历史记录和代表创建者的统计信息)。 – montelc0

0

的基本架构存在这样

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 

所以它必须被访问者在行为用户所拥有的任何后一定时间内创建。