Laravel - 按月获取数据

Posted

技术标签:

【中文标题】Laravel - 按月获取数据【英文标题】:Laravel - Get data by month 【发布时间】:2017-04-25 16:41:18 【问题描述】:

我需要按给定年份的月份检索数据。 我想在一个查询中完成。

在我的数据库架构中,我有两列存储 monthyear

我试过了:

Outgoings::where('year', 2017)->groupBy('month')->get();

但我明白了:

SQLSTATE[42000]:语法错误或访问冲突:1055 表达式 #1 的 SELECT 列表不在 GROUP BY 子句中并且包含非聚合 列“gestionale.outgoings.id”在功能上不依赖 在 GROUP BY 子句中的列上;这与 sql_mode=only_full_group_by (SQL: select * from outgoings where year = 2017 年分组 month)

所以我唯一想到的是有点棘手,获取所有月份并为每个月查询数据库并获取一个值的总和。

类似:

for ($i=1; $i<=12; $i++)
            $out = Outgoing::where('year', 2017)->where('month', $i)->get();
            // sum
        

有更好的解决方案吗?

【问题讨论】:

【参考方案1】:

在 Laravel 中默认开启严格模式,这会导致 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.

【讨论】:

我已经对其进行了测试,但for 中存在问题。由于某种原因,每个循环似乎 where 不起作用。我有$out = $data-&gt;where('month', $i)-&gt;sum('price'); 并且总是返回0 这是第一个月的总和。也许链接在哪里? @ChristianGiupponi 我没有看到数据,所以我在这里帮不了你。 我只有一个带有price = 100month=4 的条目。如果我手动设置4 它会得到结果,但在for 中只设置0。也许在每个循环中都会添加 where -&gt;where('month', 1)-&gt;where('month', 2) 等? @ChristianGiupponi 不,如果您正在使用它们,集合不会添加 wheres,正如我所展示的那样。尝试调试它。查看dd($data) 数据,打印出$data-&gt;where('month', $i)-&gt;count(); 我在查询中添加了一个监听器,在第一个循环之后我得到:select count(*) as aggregate from outgoings` where year = ?和month = ?和month = ?和month = ?` 所以它添加了哪里【参考方案2】:

每月从数据库中获取收益(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,
]);

【讨论】:

以上是关于Laravel - 按月获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何快速为 NSDate 做核心数据获取谓词?我想按月过滤

获取按月分组的最近 12 个月的数据,即使为 0

Laravel Eloquent,按月/年分组

Laravel Eloquent 搜索 JSON 数组以获取特定列的值

如何在bigquery中按月创建分区

什么策略建议按月和年分配数据帧以获得R中的单个数据帧列表