我的应用程序是使用Laravel 4.1构建的,并且几乎支持Laravel今天正式执行的所有数据库。我有一个INT(10)列,存储每个“post”的Unix时间戳,以指示帖子的创建时间。
有没有办法可以从这种设置中获得每日帖子数量?基本上,我想用Google Chart API制作一个图表,以表明过去1个月每天发布的帖子数量趋势。
另外,我不正在寻找围绕DB :: raw()的解决方案,我更喜欢使用查询构建器。
答案 0 :(得分:2)
如果要在数据库端IMHO上执行聚合,则必须使用DB::raw()
,因为您需要操作时间戳值。
如果理解正确,您的主要问题不在于使用DB::raw()
方法,而是不使用特定于供应商的日期时间函数(例如MySQL中的FROM_UNIXTIME()
)。
您可以发出这样的查询,以几乎与数据库无关的方式获取聚合结果(AFAIK所有主要DBMS都具有FLOOR()
函数的实现)
SELECT FLOOR(timestamp / 86400) AS date , COUNT(*) AS total
FROM post
GROUP BY FLOOR(timestamp / 86400)
使用查询生成器
转换为类似的内容$result = DB::table('posts')
->select(DB::raw('FLOOR(timestamp / 86400) AS date, COUNT(*) AS total'))
->groupBy(DB::raw('FLOOR(timestamp / 86400) AS date, COUNT(*) AS total'))
->get();
示例输出:
| DATE | TOTAL | |-------|-------| | 16081 | 2 | | 16082 | 3 |
这是 SQLFiddle 演示
然后在客户端代码中将date
列值转换为人类可读形式
date('m/d/Y', 16081 * 86400)
迭代结果集时。
答案 1 :(得分:0)
首先,您应该使用Laravel的created_at和updated_at列的内置时间戳。如果您不想使用Laravel的内置时间戳,则至少应该将timestamp列设置为timestamp数据类型而不是int。
话虽如此,您可能想要用于此类内容的原始SQL看起来有点像;
SELECT DATE(timestamp_column_name) as day, count(*) as post_count from posts group by day order by day asc;
没有真正的,纯粹雄辩的方式来做到这一点。像下面这样的东西会尽可能接近你。
Post::groupBy('day')->get([
DB::raw('DATE(FROM_UNIXTIME(timestamp_column_name)) as day'),
DB::raw('count(*) as post_count')
]);
这将返回两列,day
是YYYY-MM-DD格式的日期,post_count
是带计数的整数。
===========
在上面的例子中,我使用的是MySQL DATE
函数。您当然可以根据需要操纵时间戳列。这似乎对我来说最有意义。