#php #laravel #eloquent #laravel-7
Вопрос:
Есть ли способ упростить? У меня есть 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
раньше.
Это непроверенное предположение, и если в построителе запросов есть другие части, то было бы полезно их увидеть.
Вы используете a 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();
Комментарии:
1. Единственное, что я упустил, — это
$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)")
, но, к сожалению, это не сработало.