如何简化 Laravel 查询以按年搜索日期并按月分组

Posted

技术标签:

【中文标题】如何简化 Laravel 查询以按年搜索日期并按月分组【英文标题】:How do I simplify Laravel query for date searching by year and grouping by month 【发布时间】:2021-08-22 12:36:05 【问题描述】:

有没有办法简化?我为整个日期、月份和年份选择了三次 date_billing 列。有没有办法做类似->having('YEAR(date_billing)', '=', $this->year); 和月份一样的事情?我有什么工作,但它有很多重复,我相信有更好的方法。下面是

->addSelect([
    'date_billing' => Invoice::select(DB::raw('date_billing'))
     ->whereColumn("id", "=", "invoice_line_item.invoice_id"),
       
     'month' => Invoice::select(DB::raw('MONTH(date_billing) month'))
      ->whereColumn("id", "=", "invoice_line_item.invoice_id"),
    
     'year' => Invoice::select(DB::raw('YEAR(date_billing) year'))
      ->whereColumn("id", "=", "invoice_line_item.invoice_id")
])
->having('year' ,'=', $this->year)
->groupBy('month')
->get();

编辑:

我通过添加->whereYear()修复了“年”,允许我从 addSelect 数组中取出“年”,但我仍然需要有月份。

->addSelect([
   'date_billing' => Invoice::select(DB::raw('date_billing'))
   ->whereColumn("id", "=", "invoice_line_item.invoice_id"),
   ->whereYear("date_billing", $this->year),

    'month' => Invoice::select(DB::raw('MONTH(date_billing) month'))
    ->whereColumn("id", "=", "invoice_line_item.invoice_id"),
])

【问题讨论】:

【参考方案1】:

有意思,我之前没用过addSelectwhereColumn

这是未经测试的猜测,如果查询构建器还有其他部分,那么查看这些部分会很有帮助。

您是否在任何地方使用joinleftJoin

->addSelect(DB::raw('date_billing, YEAR(date_billing) year'))
->whereColumn('id', 'invoice_line_item.invoice_id')
->having('year', '=', $this->year)
->groupByRaw('MONTH(date_billing)')
->get();

【讨论】:

我唯一遗漏的部分是$query = InvoiceItem::select(DB::raw('sum(amount) as total_amount'), 'gl_code_id', 'invoice_line_item_id')。您的解决方案可能会起作用(感谢您的回复),但这并不是我想要的。我希望有一种方法可以按月分组而不使用select(MONTH(date_billing)),这可能是不可能的。我试过groupBy("MONTH(date_billing)"),不幸的是没有用。

以上是关于如何简化 Laravel 查询以按年搜索日期并按月分组的主要内容,如果未能解决你的问题,请参考以下文章

sql中如何把具体日期转化为按月排序?

Android studio 动态片段根据日期

如何简化在字符串中搜索关键字并按相关性排序的 LINQ 查询?

按月和按年分组不起作用 mongodb

sql 按计数获取日期的博客存档格式,并按月/年分组

sqlserver 如何按年按月创建分区函数