Laravel Eloquent,按月/年分组
Posted
技术标签:
【中文标题】Laravel Eloquent,按月/年分组【英文标题】:Laravel Eloquent, group by month/year 【发布时间】:2017-03-24 14:01:58 【问题描述】:我正在尝试按月和年对数据进行分组。
$data ->select(DB::raw('count(id) as `data`'),DB::raw('YEAR(created_at) year, MONTH(created_at) month'))
->groupby('year','month')
->get();
输出是:
"data": 19215,
"year": 2016,
"month": 10
,
如果我只按月份分组,我不知道这个月属于哪一年,我的预期输出是:
"clicks": 19215,
"month": 11-2016,
,
"clicks": 11215,
"month": 12-2016,
,
我想在 sql 中做,而不是在 php 中。
【问题讨论】:
【参考方案1】:对于最新版本的mysql,接受的答案会报错,所以改为尝试
$data
->selectRaw("
count(id) AS data,
DATE_FORMAT(created_at, '%Y-%m') AS new_date,
YEAR(created_at) AS year,
MONTH(created_at) AS month
")
->groupBy('new_date')
->get();
参考:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format
【讨论】:
【参考方案2】:注意:这是基于 eloquent 的解决方案,是的,这不是最好的方法,但问题是,这是使用 eloquent。如果您想要更快的方式,您可以使用原始查询来实现。
如果您想按年份对结果进行分组,您可以使用闭包将日期时间解析为所需的格式(年或月)。
下面是代码示例:
$res= ModelName::where('someColumn','test')
->get()
->groupBy(function($val)
return Carbon::parse($val->created_at)->format('Y');
);
【讨论】:
这实际上是从数据库中获取每一行到 laravel 中,然后在 php.ini 中进行分组。不推荐的方法。 这是基于 eloquent 的解决方案,是的,这不是最好的方法,但问题是,这是使用 eloquent。如果您想要更快的方式,您可以使用原始查询来完成。 如何按年份和月份分组 @Brane 如何按年份和月份分组,我们会返回这个Carbon::parse($val->created_at)->format('M-Y');
吗??
@DeanVanGreunen 来自文档,语法大概是这样的->format('F Y');
【参考方案3】:
=>这可能会在 2019 年帮助某人
$date = "2019-06-16";
return date('m', strtotime($date)); //this return you 06(edited)
所以你可以通过这种方法做foreach,所以你不需要做所有的sql事情..
【讨论】:
你是说06吗?【参考方案4】:$data ->select(DB::raw('count(id) as `data`'),DB::raw('YEAR(created_at) year'),DB::raw('MONTH(created_at) month'))
->groupBy(DB::raw('YEAR(created_at)'), DB::raw('MONTH(created_at)'))
->get();
【讨论】:
【参考方案5】:$result = ModelName::selectRaw('year(created_at) year, monthname(created_at) month, count(*) data')
->groupBy('year', 'month')
->orderBy('year', 'desc')
->get();
【讨论】:
【参考方案6】:你可以试试:
->select(DB::raw('count(id) as `data`'), DB::raw("DATE_FORMAT(created_at, '%m-%Y') new_date"), DB::raw('YEAR(created_at) year, MONTH(created_at) month'))
->groupby('year','month')
->get();
【讨论】:
QLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列 这与 MySQL 有关。请检查此***.com/q/34115174/6040777 不符合 Mysql 5.7 groupby 会失败 我已经在上面评论过它与 MySQL 相关,请查看***.com/questions/34115174/…。并且 OP 已经在他的查询中使用了groupBY
,他对此没有任何问题。在这里询问是否符合 MySQL 完全是题外话。以上是关于Laravel Eloquent,按月/年分组的主要内容,如果未能解决你的问题,请参考以下文章