[英]Laravel Eloquent, group by month/year
我正在嘗試按月和年對數據進行分組。
$data ->select(DB::raw('count(id) as `data`'),DB::raw('YEAR(created_at) year, MONTH(created_at) month'))
->groupby('year','month')
->get();
output 是:
{
"data": 19215,
"year": 2016,
"month": 10
},
如果我只按月份分組,我不知道這個月屬於哪一年,我預期的 output 是:
{
"clicks": 19215,
"month": 11-2016,
},
{
"clicks": 11215,
"month": 12-2016,
},
我想在 sql 中進行,而不是在 php 中進行。
您可以嘗試如下:
->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();
注意:這是基於 eloquent 的解決方案,是的,它不是最好的方法,但問題是,這是使用 eloquent。 如果您想要更快的方式,您可以使用原始查詢來完成。
如果您想按年份對結果進行分組,則可以使用閉包將日期時間解析為所需的格式(年或月)。
以下是代碼示例:
$res= ModelName::where('someColumn','test')
->get()
->groupBy(function($val) {
return Carbon::parse($val->created_at)->format('Y');
});
$result = ModelName::selectRaw('year(created_at) year, monthname(created_at) month, count(*) data')
->groupBy('year', 'month')
->orderBy('year', 'desc')
->get();
$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();
=>這可能對 2019 年的某人有所幫助
$date = "2019-06-16";
return date('m', strtotime($date)); //this return you 06(edited)
所以你可以通過這種方法來做 foreach,所以你不需要做所有的 sql 事情..
對於最新版本的 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
@Amit Gupta 的回答很好,但它不起作用 >= MySQL 5.7/MariaDB 10.2 並調用錯誤:
語法錯誤或訪問沖突:SELECT 列表的 1055 表達式 #2 不在 GROUP BY 子句中並且包含非聚合列
要解決該問題,您可以使用例如。 非聚合列上的MIN()
:
->select(
DB::raw("
count(id) as data,
MIN(DATE_FORMAT(created_at, '%m-%Y')) as new_date,
YEAR(created_at) year,
MONTH(created_at) month
")
)
->groupBy('year', 'month')
->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.