首页 文章

Laravel雄辩地按月或按周分组

提问于
浏览
1

我有一个项目管理我的投资,也就是说,它需要我的日常声明并将其保存在我的项目中,以便我可以看到它产生了多少,总而言之,我每天都有一张表,这些 Value ,我可以已经生成了按天分开的信息并且它完美地工作(实际上它比我做的要复杂一些,但基础是这样);

但现在看来,当我获得一个非常大的日期范围(例如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) join: 外表用于 Headers 的名称

2) join: 外地表为经纪人的名字

3) join: 表保存导入日期并与资产表中的id相关联,它具有减少搜索时间权重和获得性能的功能 .

where: 限制有问题的用户

WhereBetween: 限制日期范围

1) groupBy: 按 Headers 分组

2) groupBy: 按导入日期分组

Table structure:

ativos_extrato ativos_extratos外键

data_imports

Solution:

$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 回答

  • 1

    如果要按月分组,请添加 DB::raw(WEEK(data_imports.data_import) AS weeknumber) 然后将 ->groupBy('data_imports.data_import') 替换为 ->groupBy('weeknumber') ,将 MONTH() 替换为 MONTH() 功能:添加另一个选择列 DB::raw(MONTH(data_imports.data_import) AS monthnumber) 并将 ->groupBy('data_imports.data_import') 替换为 ->groupBy('monthnumber') . 因此,使用周分组的整个Eloquent查询将是:

    $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();
    

相关问题