【问题标题】:Group by month or week with Laravel eloquent使用 Laravel eloquent 按月或按周分组
【发布时间】:2019-05-10 06:48:28
【问题描述】:

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

但是现在看到我得到一个非常大的日期范围(例如 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) join: 保存导入日期并与asset tableExtrato中的id相关的表,它具有减少搜索时的权重并获得性能的功能.

其中:仅限于相关用户

WhereBetween:限制日期范围

1) groupBy:按标题分组

2) groupBy:按导入日期分组

表结构:

ativos_extrato ativos_extratos 外键

数据导入

解决方案:

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

【问题讨论】:

  • 能否请您发布您的数据结构和表之间的关系?
  • @user3325126 我更新了帖子以添加结构

标签: php database laravel eloquent


【解决方案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')。因此,带有周分组的整个 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(); 

【讨论】:

  • 要按月分组,我只是按月更改星期?
  • 为了按周分组,您需要添加另一列带有WEEK()函数(DB::raw(WEEK(data_imports.data_import) AS weeknumber))并将->groupBy('data_imports.data_import')替换为->groupBy('weeknumber')
  • 如果您描述了从一组行中选择最大值的正确标准,那么您的第二个问题有一个解决方案(我认为)
  • 看看我对这个问题的回答:stackoverflow.com/questions/20106966/…。在第 1 页中,您需要将您的 data_import 或 created_at 转换为 UNIX_TIMESTAMP,在第 3 页 CONCAT 中,您需要在结果中获得值,即 valor_bruto_atual大概?在第 4 页中,您应该使用 MAX 选择组中的最新时间戳。然后最后你需要将 p.4 中的串联值分开
  • 谢谢你,我能完成,根据你说的,[链接] (pastebin.com/7G56Fwh5)
猜你喜欢
  • 2017-03-24
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多