与Laravel雄辩地按月或周分组

时间:2018-12-08 22:20:51

标签: php database laravel eloquent

我有一个项目可以管理我的投资,也就是说,它需要我的每日报表并将其保存在我的项目中,以便我可以看到它的收益,总之,我有一个表格,这些表格每天都是这些值,我已经可以生成按天分隔的信息,并且可以完美运行(实际上,它比我所做的要复杂一些,但基础是这个);

但是现在很难看到何时有一个很大的日期范围(例如1年),它列出了每天,我想要一种按月或周进行分组的方法,

在此先感谢您的帮助。

    $rows =  AtivosExtrato::select('titulo_id', DB::raw('SUM(valor_bruto_atual) AS valor'), 'data_imports.data_import as created_at')
    ->join('titulos','titulo_id', '=', 'titulos.id' )
    ->join('representantes','representante_id', '=', 'representantes.id' )
    ->join('data_imports','data_import_id', '=', 'data_imports.id' )
    ->where('user_id', Auth::user()->id) 
    ->whereBetween('data_imports.data_import', [$request->input('start_date'), $request->input('end_date')])
    ->groupBy('titulos.nome_titulo')
    ->groupBy('data_imports.data_import')
    ->orderBy('data_import')
    ->orderBy('titulos.nome_titulo')
    ->get();  

简短地解释每个雄辩的信息是什么

AtivosExtrato:模型,其中包含每日收入信息;

1)联接:标题名称的外表

2)联接:代理名称的外部表

3)联接:表,用于保存导入日期并与资产表中的ID相关。Extrato具有减少搜索时间的权重并获得性能的功能。

其中:仅限有问题的用户

在此之间:限制日期范围

1)groupBy:按标题分组

2)groupBy:按导入日期分组

表结构:

ativos_extrato ativos_extratos ativos_extratos外键 ativos_extratos Index

数据导入 data_imports

解决方案:

$rows =  AtivosExtrato::select(
            'titulo_id',
            DB::raw('SUM(valor_bruto_atual) AS valor'),
            'data_imports.data_import as created_at',
            DB::raw('WEEK(data_imports.data_import) AS weeknumber')
        )
        ->join('titulos','titulo_id', '=', 'titulos.id' )
        ->join('representantes','representante_id', '=', 'representantes.id' )
        ->join('data_imports','data_import_id', '=', 'data_imports.id' )
        ->where('user_id', Auth::user()->id)
        ->whereIn('ativos_extratos.data_import_id',
        DataImport::Select(DB::raw('max(ID)'))
            ->whereBetween('data_import',  [$request->input('start_date'), $request->input('end_date')])
            ->groupBy(db::raw('Week(data_import)'))            )
            ->whereBetween('data_imports.data_import', [$request->input('start_date'), $request->input('end_date')])
        ->groupBy('titulos.nome_titulo')
        ->groupBy('weeknumber')            
        ->orderBy('data_import')            
        ->orderBy('titulos.nome_titulo')
        ->get();

1 个答案:

答案 0 :(得分:1)

添加DB::raw(WEEK(data_imports.data_import) AS weeknumber),然后将->groupBy('data_imports.data_import')替换为->groupBy('weeknumber'),如果要按月分组,则将其替换为MONTH()函数:添加另一个选择列DB::raw(MONTH(data_imports.data_import) AS monthnumber)并将->groupBy('data_imports.data_import')替换为->groupBy('monthnumber')。因此,带有周分组的整个口才查询将是:

$rows =  AtivosExtrato::select('titulo_id', DB::raw('SUM(valor_bruto_atual) AS valor'), 'data_imports.data_import as created_at', DB::raw('WEEK(data_imports.data_import) AS weeknumber'))
->join('titulos','titulo_id', '=', 'titulos.id' )
->join('representantes','representante_id', '=', 'representantes.id' )
->join('data_imports','data_import_id', '=', 'data_imports.id' )
->where('user_id', Auth::user()->id) 
->whereBetween('data_imports.data_import', [$request->input('start_date'), $request->input('end_date')])
->groupBy('titulos.nome_titulo')
->groupBy('weeknumber')
->orderBy('data_import')
->orderBy('titulos.nome_titulo')
->get();