如何简化 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】:有意思,我之前没用过addSelect
或whereColumn
。
这是未经测试的猜测,如果查询构建器还有其他部分,那么查看这些部分会很有帮助。
您是否在任何地方使用join
或leftJoin
?
->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 查询以按年搜索日期并按月分组的主要内容,如果未能解决你的问题,请参考以下文章