我需要按指定年份的月份检索数据 我想在一个查询中做到这一点。
在我的数据库架构中,我有两列存储month
和year
。
我试过了:
Outgoings::where('year', 2017)->groupBy('month')->get();
但我明白了:
SQLSTATE [42000]:语法错误或访问冲突:1055表达式#1 SELECT列表不在GROUP BY子句中并包含nonaggregated 列'gestionale.outgoings.id',它不依赖于功能 在GROUP BY子句中的列;这是不相容的 sql_mode = only_full_group_by(SQL:select * from
outgoings
whereyear
= 2017年组month
)
所以我想到的唯一一件事就是有点棘手,抓取所有月份和每个月查询数据库并得到一个值的总和。
类似的东西:
for ($i=1; $i<=12; $i++){
$out = Outgoing::where('year', 2017)->where('month', $i)->get();
// sum
}
有更好的解决方案吗?
答案 0 :(得分:2)
在Laravel中默认启用Scrict模式,这会导致sql_mode=only_full_group_by
错误。您可以在config/database.php
:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
....
'strict' => false, // This is the option you need to change.
'engine' => null,
],
如果您不想使用groupBy()
并且想要迭代数据,请先加载数据然后使用集合。例如,此代码将只创建一个查询(您的代码将创建12个查询):
$data = Outgoing::where('year', 2017)->get();
for ($i=1; $i<=12; $i++) {
$out = $data->where('month', $i);
// Do something with $out.
}
答案 1 :(得分:0)
每月从数据库中获取收入(Laravel):-
$getMonthlyReport = OrderMaster::select(DB::raw("sum(order_total_amt) as earnings,date_format(order_date, '%Y-%m') as YearMonth"))
->groupBy('order_date')
->get();
$dataArr = [];
$labelArr = [];
foreach($getMonthlyReport as $report){
array_push($dataArr, $report->earnings);
array_push($labelArr, $report->YearMonth);
}
return Response::json([
'status' => true,
'data' => $dataArr,
'label' => $labelArr,
]);
}