Как упростить запрос Laravel для поиска дат по годам и группировки по месяцам

#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)") , но, к сожалению, это не сработало.